2016-04-11 13 views
2

は、すべてのBノードはCノードが含まれていることを確認し、あなたが書くことができます任意のブールXPathがあります。私はのXpath - チェックすべての要素がサブ要素を持つ文書</p> <pre><code><a> <b> <c/> <d/> </b> <b> <c/> <d/> </b> </a> </code></pre> <p>考える

boolean(//a/b/c) 

を試してみましたが、これだけのノードのうちの少なくとも1つは、Cノードが含まれていることを確認し、すべてではないそれらの

答えて

4

//a/b[c]は、少なくとも一つのc子要素を持つすべてのbの要素に一致します。

私が子供の頃にcを持っていない0 b要素があることを主張するだろうけど。(代わりにcount(...) = 0の)not(//a/b[not(c)])としてクエリを策定

count(//a/b[not(c)]) = 0 
+0

は、それだけで選び出しその場合のケース – user898465

+0

@ user898465確かに更新されました。 – alecxe

+0

ありがとうございました! – user898465

2

は、プロセッサは、第1のカウンタを見つけた後に停止できるようにしますすべてを数える必要はありません。

あなたがより明示的に(だけでなく、もう少し冗長)になりたい場合は、あなたがquantified expressionを使用することができます。すべてのb要素が交流要素を持っていた場合はまだあなたを教えてくれない

every $b in //a/b satisfies $b/c 
+0

良い点 - プロセッサは、テストが 'count(...)= 0'という形式になったときに原則的に気付き、2つの式を同じコンパイル済みコードにコンパイルすることができます。私はいくつかは信じています。 –

+0

私はBaseXが(そして私はSaxonもそうだと確信していますが)知っていますが、私はどのプロセッサが使用されているかわからない限り、そのような最適化を期待しません。洗練されたXQueryオプティマイザよりもはるかに多くのXQuery実装があります。 ;) –

+1

まあまあです。しかし、自分で言えば、プログラマーの時間でダブルネガティブな沼地を読んでいるときのコストは実行可能性が高いことを知っているので、問題のテストが私は繰り返し待っています。 Jon Bentleyの主題の本で教えられる[テキストレベル]最適化の最初のルールは、絶対に*必要ない場合は、それをしないでください。 –