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