0

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>

下: XSLT で現在の要素パスをどのように出力しますか?

いくつかの変更により、これは次のように入力して必要なものを出力します。

<xsl:call-template name="genPath">

どこかですが、この方法で呼び出すと、現在のノードへのパスが出力されます。現在のノードの特定の子へのパスを書き込めるように変更するにはどうすればよいですか?

何かのようなもの:

<xsl:call-template name="genPath" select="n1:tagname/n1:tagname2">

(上記の構文が間違っていることは知っています)

4

4 に答える 4

1

XSLT2.0 を使用している場合は、次のように記述できます。

 <xsl:template match="three[@this='true']">
    <xsl:value-of select="ancestor-or-self::*/(count(preceding-sibling::*) + 1)" separator="," />
 </xsl:template>

ただし、XSLT 1.0 しかない場合は、祖先ごとに別のテンプレートを呼び出すことでこれを行うことができます。

 <xsl:template match="three[@this='true']">
   <xsl:apply-templates select="ancestor-or-self::*" mode="position" />
 </xsl:template>

 <xsl:template match="*" mode="position">
    <xsl:if test="parent::*">,</xsl:if>
    <xsl:number count="*" />
 </xsl:template>

編集:これを任意の要素に適用できるようにするには、これを任意の要素に一致するテンプレートに配置しますが、モード属性を使用します。例えば

 <xsl:template match="*" mode="genPath">
   <xsl:apply-templates select="ancestor-or-self::*" mode="position" />
 </xsl:template>

 <xsl:template match="*" mode="position">
    <xsl:if test="parent::*">,</xsl:if>
    <xsl:number count="*" />
 </xsl:template>

次に、「子」要素に対して呼び出すには、これを行うだけです

<xsl:apply-templates select="n1:tagname1/n1:tagname2" mode="genPath" />
于 2013-09-20T07:43:11.770 に答える