兄弟ノードに特定の値がある場合、XPathを使用してノードを選択するにはどうすればよいですか?


88

私は次の文書を持っています:

<a>
  <bb>abc</bb>
  <cc>ccc</cc>
  <dd>ddd</dd>
</a>
<a>
  <bb>zz</bb>
  <cc>1</cc>
  <dd>2</dd>
</a>

どのように私はの値を得ることができ<cc>た場合にXPathを使用して<bb>いるのzz


1
問題は、特定のノードにアクセスする方法を知っていることですが、兄弟が特定の値を持っている場合、ノードにアクセスする方法がわかりません。/ a / cc / contains(/ a / bb = 'zz')のようなものでしょうか?
HOE SENGKIANG 2013年

回答:


99

誰もが兄弟を照会している理由がわからない場合は<bb/>、の述語の述語に一致する要素を確認することもできます<a/>

//a[bb/text() = "zz"]/cc/text()

23
「なぜみんなが兄弟を
探して

4
私は実際にタイトルを読んでいないようです。:)とにかく答えは有効なままです。
Jens Erat 2013年

2
あなたの答えは兄弟にも質問します。*-sibling軸を使用しなかっただけです。ただし、+ 1。
LarsH 2013年

これは質問に答えませんが、私がひどく定式化した私の実際の質問に答えます。ありがとうございました!
user92 1319

37

必要なのはfollowing-siblingXPath軸です

//a/bb[text()="zz"]/following-sibling::cc[1]/text()

ここでXpathをテストします:http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625


4
@HOESENGKIANG:この回答を「受け入れる」には、チェックマークをクリックするか、質問に最もよく答えると思う方をクリックする必要があります。
LarsH 2013年

23

Q:兄弟ノードに特定の値がある場合、XPathを使用してノードを選択するにはどうすればよいですか?
次の兄弟と前の兄弟には「XPath軸」しかないため、位置が固定されている場合は、そのうちの1つを使用できます。

しかし、より良い:cc親がbb価値のある子供を持っているか どうかを探してください'zz'

//cc[../bb='zz']

6
それか//a[bb = 'zz']/cc
Tomalak 2013年

'次の兄弟と前の兄弟の「XPath軸」のみ'が何を意味するのかわからない。すべての兄弟に単一の軸がないという事実に言及していますか?
LarsH 2013年

@LarsH:はい、ごめんなさい(私の悪い英語を失礼します:-()-それは私が言おうとしていたことでした。(質問は兄弟のためだったので。)
hr_117 2013年

6

まず、あなたの例は整形式のXMLではありません。それを見落とし、あなたがあなたの意図をあまりよく説明していなかったこと(あなたはどの条件で何を正確に選択したいですか?)、私はあなたがこれをしたいと思うと思います:

//cc[preceding-sibling::bb[text()="zz"]]/text()

選択します

TEXT VALUES OF ALL <CC> ELEMENTS
//cc                                    /text()
    THAT HAVE A PRECEDING SIBLING <BB>
    [preceding-sibling::bb             ]
                          THAT HAS TEXT VALUE EQUAL TO "zz"
                          [text()="zz"]

あなたが書くこともできます

//bb[text()="zz"]/following-sibling::cc/text()

仕様を見てください。非常に読みやすいがいくつかあり、そこから多くのことを学ぶことができます。


1
@LarsH「無効」から「整形式ではない」に修正していただきありがとうございます。今日は何か新しいことを学びました。
ペトルJaneček

4
//a/cc[../bb='zz']/text()

// a:場所に関係なくすべての「a」要素を選択します。

// a / cc:「a」要素の子である「cc」要素を選択します(aがどこにあるかに関係なく)。

..:現在のノードの親を選択します。

[../bb='zz ']:兄弟の' bb '要素の値はzzです。

参照:http//www.w3schools.com/xsl/xpath_syntax.asp


4

この問題の別の解決策は

//bb[contains(.,'zz')]/../cc/text()

説明:のすべての子ノードに文字列bbを含むものは、を使用してその親ノードに移動します。これで、'zz'bbbb..ccます。これで、返されるテキストにた。

説明が複雑でないことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.