5

現在のノードのすべての祖先を取得したい:

XML:

<root>
   <item title="a">
       <item title="b">               
           <item title="c"></item> <!--CURRENT-->
           <item title="d"></item>                 
        </item> 
       <item title="x">             
           <item title="y"></item> 
           <item title="z"></item>  
       </item>            
   </item> 
</root>

結果:

<item title="a">...</item>
<item title="b">...</item>

編集:軸の祖先を持つ回答は問題ありません。私の問題はXSLTの他の場所にありました

XSLT:

<xsl:variable name="curr" select="//item[@title = 'c']"></xsl:variable>
<xsl:variable name="test" select="$curr/ancestor::item"></xsl:variable>

<xsl:for-each select="$test/item">
<xsl:value-of select="@title"></xsl:value-of>
</xsl:for-each>

戻り値:

bcdx

Edit2: dimitreおよび同様の問題を抱えているすべての人のために

私の質問に対するすべての答えは良かった。

XSLT(上)だけで奇妙な結果が返され、@MadsHansenが私を修正しました。

最終的な作業例:

XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
   <item title="a">
       <item title="b">               
           <item title="c"></item> 
           <item title="d"></item>                 
        </item> 
       <item title="x">             
           <item title="y"></item> 
           <item title="z"></item>  
       </item>            
   </item> 
</root>

XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:variable name="curr" select="//item[@title = 'c']"></xsl:variable>
        <xsl:variable name="test" select="$curr/ancestor::item"></xsl:variable>

        <xsl:for-each select="$test">
            <xsl:value-of select="@title"></xsl:value-of>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

戻り値:

ab
4

4 に答える 4

5

非常に迅速な最初の答えのためにアダムにおめでとう。

少し詳細を追加するだけです:

あなたのリストされた期待される結果はあなたの言葉と一致しません。ルート要素も祖先ノードであり、ドキュメントも祖先ノードです。

ancestor::node()

...次の順序でシーケンスを返します:

  1. item[@title='b']
  2. item[@title='a']
  3. root要素(別名ドキュメント要素)
  4. ルートノード /

リストした特定の結果を取得するには、次のものが必要です。

ancestor::item/.

/の効果。順序をドキュメントの転送順序に戻すことです。祖先::のネイティブの順序は、ドキュメントの逆の順序です。


更新:コメントフィードで作成されたポイントの図。

このスタイルシート(OPの入力付き)...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/">
  <xsl:for-each select="//item[@title='c']">
    <xsl:value-of select="ancestor::item[1]/@title" />
    <xsl:value-of select="ancestor::item[2]/@title" />
  </xsl:for-each>  
</xsl:template>         
</xsl:stylesheet>

...は、祖先::が実際に逆軸であるという点を示す「ba」を出力します。それでもこのスタイルシート...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/">
  <xsl:for-each select="//item[@title='c']">
    <xsl:value-of select="(ancestor::item/@title)[1]" />
    <xsl:value-of select="(ancestor::item/@title)[2]" />
  </xsl:for-each>  
</xsl:template>

</xsl:stylesheet>

...結果は逆になります'ab'。これは、XSLT 1.0(XSLT 2.0ではそうではない)では括弧が逆の性質を取り除き、ドキュメント順序のノードセットになることを示しているため、有益です。

OPは次のよ​​うな変換について質問しました。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/">
  <xsl:for-each select="//item[@title='c']">
    <xsl:for-each select="ancestor::item">
      <xsl:value-of select="@title" />
    </xsl:for-each>
  </xsl:for-each>  
</xsl:template>

</xsl:stylesheet>

これは「ab」を返します(XSLT 2.0では「ba」を返します)。なんで?XSLT 1.0では、xsl:for-each命令は軸の逆さを無視し、ドキュメントの順序で処理するためです(xsl:sort命令で特に指定されていない場合)。

于 2012-09-11T12:42:07.830 に答える
3

現在のノードのすべての祖先を取得したい

指定されたノードは、明らかに「グリーン」ノードのすべての祖先ではありません。

すべての祖先を選択するには、次を使用します。

ancestor::node()

これにより、最初のconextノード(または現在のノード)のすべての祖先ノードが選択されます。これには、最上位の要素とその親(ルートノード /)が含まれます。これはノードですが、要素ではありません。

すべての要素の祖先を選択するには、次を使用します。

ancestor::*

これは前の式に似ていますが、要素ではないため、ルートノード( )を選択しません。/

、という名前のすべての祖先を選択するには、次itemを使用します

ancestor::item

(//item[@title='c'])[1]:上記のすべての式は、が初期コンテキストノード(現在のノード)であることを前提としています。この仮定が正しくない場合は、(//item[@title='c'])[1]/各式の前に追加する必要があります。

注2 :XPathを学習して、XPathVisualizerなどのツールを使用することを強くお勧めます。長年にわたり、このツールは、XPath式で遊んだり、評価の結果を観察したりすることで、何千人もの人々がXPathを楽しい方法で学ぶのに役立ってきました。

:XPath Visualizerは、2000年に私が作成したものであり、金融​​商品ではありませんでした。長年にわたって証明されてきた、ユーザーにとっての価値だけに基づいて推奨しています。

于 2012-09-11T12:42:56.503 に答える
2

xpathを使用できますancestor::item

于 2012-09-11T12:34:33.533 に答える
1

bcdxではなく出力した理由は、変数内の選択された要素を反復処理するだけでなく、選択された要素のすべての子を反復処理しているabためです。<xsl:for-each>itemitem$test

for-eachを変更して、繰り返し処理し$testます。

<xsl:variable name="curr" select="//item[@title = 'c']"></xsl:variable>
<xsl:variable name="test" select="$curr/ancestor::item"></xsl:variable>

<xsl:for-each select="$test">
    <xsl:value-of select="@title"></xsl:value-of>
</xsl:for-each>
于 2012-09-11T23:11:46.490 に答える