2009-07-08 6 views
2

は、私は私のXML文書内のノードのこの種を持っている:2つの既知の子を持つすべての親を取得するXPathを書くには?

<parent ...> 
    <a .../> 
    <b .../> 
</parent> 

親ノードは、AとB、のみ、Bのみ、またはそれらのどれも、両方を持つことができます。私は両方を持っているすべての親を取得するXPathを書いています。それをしてもいいですか?

親には他の子供もいます。

答えて

2
<element> 
    <a/> 
    <b/> 
</element> 

element[child::a][child::b] 

追加の子を持っているかどうかにかかわらず、直接の子としてaとbを持つすべての要素を選択する必要があります。または、より簡単に:

element[a][b] 

...と思います。このような

1

何かがそれを行う必要があります。 // [a、bの]

+0

'parent'という名前の親ノードを具体的に検索するか、 'a'と 'b'という子要素を持つノードを検索しますか? –

0
//parent[count(a) > 0 and count(b) > 0] 

はそれを行う必要があります。

+0

は、parent :: * [count(a)> 0かつcount(b)> 0]でなければならないでしょうか? –

+0

@Brian Agnew:いいえ、そうです - 私は "parent"という名前の要素と親:: xpath軸という要素を混乱させていました。 Mea Culpa。 –

+0

それは良いですね:-)フィードバックのThx –

1
//*[child::a and child::b] 
1

明白などのハイライトの観点マッチしたノードでの生活は非常に簡単になります偉大なXPathのテストベッドhere、あります:

parent[a and b] 

子軸が述語で暗黙的であるが、これは何も存在することを意味しませんそれに言及する必要があります。条件は連言(「および」)であるとして

parent[child::a and child::b] <!-- the same, only longer --> 

二つの別個の述語の使用は限り可能である:

parent[a][b] <!-- the same, slightly shorter --> 

これは、式の長さの3つの文字保存します。ただし、2つの述部を使用すると、順番に適用されるため、2つの別々の検査がトリガーされます。ブール演算子を持つ述語を使用することは、私にとって最もシンプルでクリーンなアプローチであるようです。

関連する問題