xslt で特定のソース ノードへのパスを特定する方法があるかどうか疑問に思います。次のソース XML ファイルがあるとします。
<one>
<two>
<three/>
<three this="true"/>
</two>
<two>
<three/>
</two>
</one>
属性 this="true" を持つノード 3 で次のようなものを出力する関数 (カスタム テンプレート) が必要です: "1,1,2" - つまり、ルートから開始して最初の要素に入ります。 、次に最初の要素、次に 2 番目の要素に移動して、この特定のノードに到達します。
(これの目的は、ソース XML ドキュメントの特定の場所から取得したコンテンツに一意の識別子を付け、それを目的の出力に変換することです)
編集:私はこれを見つけました:
<xsl:template name="genPath">
<xsl:param name="prevPath"/>
<xsl:variable name="currPath" select="concat('/',name(),'[',
count(preceding-sibling::*[name() = name(current())])+1,']',$prevPath)"/>
<xsl:for-each select="parent::*">
<xsl:call-template name="genPath">
<xsl:with-param name="prevPath" select="$currPath"/>
</xsl:call-template>
</xsl:for-each>
<xsl:if test="not(parent::*)">
<xsl:value-of select="$currPath"/>
</xsl:if>
</xsl:template>
いくつかの変更により、これは次のように入力して必要なものを出力します。
<xsl:call-template name="genPath">
どこかですが、この方法で呼び出すと、現在のノードへのパスが出力されます。現在のノードの特定の子へのパスを書き込めるように変更するにはどうすればよいですか?
何かのようなもの:
<xsl:call-template name="genPath" select="n1:tagname/n1:tagname2">
(上記の構文が間違っていることは知っています)