簡単な例を次に示します。
<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:param name="pBase" select="'http://myBase.com/'"/>
<xsl:template match="num">
<xsl:if test="position() > 1">, </xsl:if>
<a href="{$pBase}{.}"><xsl:value-of select="."/></a>
</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>
必要な正しい結果が生成されます。
<a href="http://myBase.com/01">01</a>, <a href="http://myBase.com/02">02</a>, <a href="http://myBase.com/03">03</a>, <a href="http://myBase.com/04">04</a>, <a href="http://myBase.com/05">05</a>, <a href="http://myBase.com/06">06</a>, <a href="http://myBase.com/07">07</a>, <a href="http://myBase.com/08">08</a>, <a href="http://myBase.com/09">09</a>, <a href="http://myBase.com/10">10</a>
ブラウザに次のように表示されます。
01、02、03、04、05、06、07、08、09、10 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
説明:
XSLT は関数型言語です。これは、変数を一度定義すると変更できないことを意味します。
標準の XPathposition()
関数を使用して、現在のノードの位置に特定の値があるかどうかを確認できます。
組み込みの XSLT テンプレートが使用され、要素に一致するテンプレートの本体は<xsl:apply-templates/>
. これは次の省略形です:<xsl:apply-templates select="child::node()"/>
現在のノードのすべてのノードの子にテンプレートを適用します -- ドキュメントの順序で。
を指定<xsl:strip-space elements="*"/>
したため、XML ドキュメントの解析中に、任意の要素の空白のみの子が削除されました。これにより、最上位要素の非空白の子ノードのみが残りnums
、それらはすべてnum
要素です。
テンプレート内の関数の値は、命令が実行さposition()
れたときに形成されるノード リスト内の現在のノードの位置です。<xsl:apply-templates>
これはposition()
、テンプレート マッチング内の関数の値が、 num
1 番目のnum
要素が処理されると 1、2 番目の要素が処理されると 2 num
、...、10 番目のnum
要素が処理されると 10 であることを意味します。
の値が 1 より大きいすべてのnum
要素に対して生成された出力は、文字列 ", " で始まります。この質問の要件とまったく同じです。position()
この場合の値は 1 であるため、最初のnum
要素の文字列 ", " は生成されませんposition()
。