XSLT 2.0 で、グローバル変数に格納されたノード セットを xsl:template マッチ パターンで使用することは可能ですか。
はい。ただし、変数参照は predicate でのみ発生できます。
W3C XSLT 2.0 仕様の 8 つの構文規則によると、
パターンは *relativePathPattern* の結合であり(最終的には '/' または '//' を先頭に追加できます)、各relativePathPatternは *patternStep* で構成され、それぞれの構文は次のとおりです。
[4] PatternStep ::= PatternAxis? NodeTest PredicateList
PatternAxisとNodeTestの両方に文字を含めることはできません$
。つまり、変数参照は述語でのみ許可されます。
これは非常に簡単な例です:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vOdds" select="/*/*[. mod 2 = 1]"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="num[. = count($vOdds)]">
<num special="yes"><xsl:value-of select="."/></num>
</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>
必要な正しい結果が生成されます。
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num special="yes">05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>