I. (増加する) 位置を指定して任意の値を連結する一般的で強力な方法を次に示します。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pPositions" select="'|1|2|3|'"/>
<xsl:template match="value">
<xsl:if test="contains($pPositions, concat('|',position(),'|'))">
<xsl:value-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
この変換が提供された XML ドキュメントに適用されると、次のようになります。
<root>
<level1>
<level2>
<value>A</value>
<value>B</value>
<value>C</value>
<value>D</value>
<value>E</value>
<value>F</value>
</level2>
</level1>
</root>
必要な正しい結果が生成されます。
ABC
value
1 番目、3 番目、6 番目の要素の値を連結したい場合は、対応する$pPositions
パラメーターを指定するだけです。
<xsl:param name="pPositions" select="'|1|3|6|'"/>
そして同じ、変更されていない XSLT コードが、今、望むものを生成します:
ACF
Ⅱ.位置のシーケンス (必ずしも増加するわけではない) がある場合、事態はさらに興味深いものになります。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pPositions">
<p>4</p>
<p>1</p>
<p>3</p>
</xsl:param>
<xsl:variable name="vPositions" select=
"document('')/*/xsl:param[@name='pPositions']"/>
<xsl:template match="/">
<xsl:variable name="vDoc" select="."/>
<xsl:for-each select="$vPositions/p">
<xsl:value-of select="$vDoc/*/*/*/value[position()=current()]"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
同じ XML ドキュメント (上記) に適用すると、必要な正しい結果が得られます。
DAC
III. これは、XSLT 2.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 method="text"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pPositions" as="xs:integer*" select="4,1,3"/>
<xsl:template match="/">
<xsl:value-of separator="" select=
"for $n in $pPositions
return
/*/*/*/value[$n]
"/>
</xsl:template>
</xsl:stylesheet>