2016-06-01 7 views
0

がどのように私はその子供たちすべてfigureあるすべてdivの要素を選択することができますのXpathは、特定のタイプのノードが含まれてい

<div id="one"> 
    <figure>foo</figure> 
    <figure>bar</figure> 
</div> 
<div id="two"> 
    <figure>foo</figure> 
    <div>bar</div> 
</div> 
<div id="three"> 
    <div>bar</div> 
</div> 

(私は下のそれらを参照することができるようにid属性のみ追加)これを取るノードを取得します要素、すなわち指定された例でのみdivを選択しますか?

私が必要とするのは//div[count(not figure)>0]です。

答えて

1

これは、1つの可能な方法である:

//div[not(*[name() != 'figure']) and not(text()[normalize-space()])] 

andの左側がdiv子「数字」以外の名前の要素、および右サイドを持っていないことを確認しますが、それはdoesnのを確認してください空でない子テキストノードを持つ。

または、同じアプローチが、使用してcount()

//div[count(*[name() != 'figure']|text()[normalize-space()]) = 0] 
+0

ありがとう、テキストのものは私が考えていないものです。私の答えはどう思いますか?仕事をしているようですが、私はあなたの56.6kの経験に伏します! – artfulrobot

+0

ハハ..あなたはする必要はありません。はい、答えが必要です。おそらく、 '

'とテキストノードの組み合わせを含む' div'を持っていると思います(この 'div'は選択に適格ではないと仮定します) – har07

+0

ええ、 )テキストノードであり、非空のテキストノードを心配する必要はないので、 'node()'ではなく '*'を数えています。すなわち、* element *ノードのみ。これは、テキストノードを無視します。 – artfulrobot

0

私はこのようにそれをやった:

//div[figure][count(figure) = count(*)] 

これは、少なくとも一つのfigureを含まなければならないのdivを見つけ、それがいることを確認しますfigure要素の数は他のすべての要素の数に一致します。これが真実なら、それは他に何も含めることができません。

関連する問題