結果をJavaのStringに取得し、それらをパラメーターとして次のテンプレートに渡すことで、この機能を実装できます。しかし、XSLTを介して同じことが直接実行できるかどうかを知りたいと思いました。
はい、XSLT2.0の例を次に示します。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pP1" select="2"/>
<xsl:param name="pP2" select="3"/>
<xsl:param name="pP3" select="5"/>
<xsl:variable name="vPass1">
<xsl:apply-templates mode="pass1">
<xsl:with-param name="pP1" select="$pP1"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:variable name="vPass2">
<xsl:apply-templates mode="pass2">
<xsl:with-param name="pP2" select="$pP2"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:variable name="vPass3">
<xsl:apply-templates mode="pass3">
<xsl:with-param name="pP3" select="$pP3"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:template match="/">
<xsl:value-of select="$vPass1 + $vPass2 + $vPass3"/>
</xsl:template>
<xsl:template match="/*" mode="pass1">
<xsl:param name="pP1" as="xs:integer"/>
<xsl:value-of select="sum(*[. mod $pP1 = 0])"/>
</xsl:template>
<xsl:template match="/*" mode="pass2">
<xsl:param name="pP2" as="xs:integer"/>
<xsl:value-of select="sum(*[. mod $pP2 = 0])"/>
</xsl:template>
<xsl:template match="/*" mode="pass3">
<xsl:param name="pP3" as="xs:integer"/>
<xsl:value-of select="sum(*[. mod $pP3 = 0])"/>
</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>
3つのパスが実行され、それぞれに独自のパラメーターがあります。num
各パスは、要素の合計を計算します。その値は、指定されたパラメーターの倍数です。最後に、3つのパスの結果が合計され、最終結果として返されます。
63
XSLT 1.0プロセッサでもまったく同じ変換を実行できますが"as='xs:integer'"
、コードから文字列を削除する必要があります。