XSLT - это функциональный язык. В функциональных языках переменные, однажды заданные значения, не могут быть изменены .
Можно добиться того же эффекта, что и при изменении переменной, используя xsl:param
в шаблоне и передавая в новом вызове шаблона новое значение для этого параметра.
Вот краткий и полный пример :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="nums">
<xsl:call-template name="sum"/>
</xsl:template>
<xsl:template name="sum">
<xsl:param name="pList" select="*"/>
<xsl:param name="pAccum" select="0"/>
<xsl:choose>
<xsl:when test="not($pList)">
<xsl:value-of select="$pAccum"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="sum">
<xsl:with-param name="pList"
select="$pList[position() > 1]"/>
<xsl:with-param name="pAccum" select="$pAccum+$pList[1]"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к этому документу XML :
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
получен правильный результат :
55
Обратите внимание , как параметры «модифицируются»:)