Re: [xsl] Applying xsl to a resulttree.

Subject: Re: [xsl] Applying xsl to a resulttree.
From: Mike Brown <mike@xxxxxxxx>
Date: Thu, 12 Dec 2002 11:07:01 -0700 (MST)
jborella@xxxxxxx 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[@name='calc0']"/>
    </result>
  </xsl:template>

  <xsl:template match="calculation[@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[@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[@name=current()/@ref]">
            <xsl:apply-templates select="../../calculation[@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


Current Thread