xsl-list
[Top] [All Lists]

Re: Applying xsl to a resulttree.

2002-12-12 11:07:01
jborella(_at_)it-c(_dot_)dk wrote:
Is it possible to apply the same template more than once to some xml?
For instance evaluating:

<calculation name="calc0" type="+">
    <calculation type="ref" ref="calc1"/>
</calculation>
<calculation name="calc1" type="-">
    <calculation type="value" ref="2"/>
    <calculation type="value" ref="4"/>
</calculation>

should be done by evaluating "calc1" first then "calc0" using the result
from "calc1".

You should use a recursive, functional approach.
See if you can follow the logic here...


<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

  <xsl:output method="xml" indent="no"/>

  <xsl:template match="/">
    <result>
      <xsl:apply-templates select="data/calculation[(_at_)name='calc0']"/>
    </result>
  </xsl:template>

  <xsl:template match="calculation[(_at_)name]">
    <xsl:variable name="operand1">
      <xsl:apply-templates select="calculation[1]"/>
    </xsl:variable>
    <xsl:variable name="operand2">
      <xsl:choose>
        <xsl:when test="calculation[2]">
          <xsl:apply-templates select="calculation[2]"/>
        </xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="@type='+'">
        <xsl:value-of select="$operand1 + $operand2"/>
      </xsl:when>
      <xsl:when test="@type='-'">
        <xsl:value-of select="$operand1 - $operand2"/>
      </xsl:when>
      <xsl:otherwise>0</xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="calculation[(_at_)ref]">
    <xsl:choose>
      <xsl:when test="@type='value'">
        <xsl:value-of select="@ref"/>
      </xsl:when>
      <xsl:when test="@type='ref'">
        <xsl:choose>
          <xsl:when test="../../calculation[(_at_)name=current()/@ref]">
            <xsl:apply-templates 
select="../../calculation[(_at_)name=current()/@ref]"/>
          </xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>
      </xsl:when>
      <xsl:otherwise>0</xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>


Mike

-- 
  Mike J. Brown   |  http://skew.org/~mike/resume/
  Denver, CO, USA |  http://skew.org/xml/

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>