2009-07-31 10 views
1

特定の要素に特定の子要素がないことを満たすコレクション内の文書を取得したいと考えています。たとえば、以下の2つの「文書」から、子要素があるので、文書2を選択しますが、文書1は選択しません。「要素にはこの子がありません」を達成する機能はありますか?

ドク1

<doc> 
<element> 
    <child/> 
</element> 
</doc> 

Doc2の

<doc> 
<element> 
    <other-child/> 
</element> 
</doc> 

私はこれをやってみました:

for $item in collection('/db/collection') 
where not($item//child) 
return $item 

しかし、これはいくつかの理由で動作しません。 exists、シーケンス機能などのさまざまな組み合わせも試みましたが、私が望む結果を得ることができませんでした。

明確にするために、not($item//child)テストは、私がそれがやると思うことをしていないようです。上記のクエリは、コレクション内のすべてのドキュメントを返します。それは要素があるかどうかです。 逆しかし、作品:

for $item in collection('/db/collection') 
where $item//child 
return $item 

このクエリは、子要素を持って、正確にそれらの文書を返します。

何がありますか?

+0

これは本当に奇妙です。代わりに 'count($ item // child)'を使用すると、出力はどのようになりますか?0があればそれはありますか? –

+0

ああ、ところで、どのXQueryの実装が使用されていますか? –

+1

私はSaxon 9を使ってこれをチェックしましたが( 'collection'ではなく' 'ノードのプレーンなシーケンスを使用しています)、あなたの記述ではなく、期待される結果が見えます。実際のXMLが複雑であるか、クエリが記述されていないか、実装がバグや不適合であるように見えます。 –

答えて

0

ネームスペースのないドキュメントや最新のsvnスナップショットで動作するため、ネームスペースのxmlドキュメントを使用すると、eXistのXQueryエンジン(1.2.6)のバグと思われます。
Bummer。一瞬のためにこのことについてどのように、バグを回避するために

0

for $item in collection('/db/collection') 
return 
    if ($item//child) then 
    $item 
    else 
    () 
2

私はあなたの望ましい結果を達成するために)(あなたが両方ない(使用する必要があると思う)とが存在します。あなたの名前空間の問題について

for $item in collection('/db/collection') return 
    if (not(exists($item//child))) then $item 
    else() 

::だから、私はあなたのような何かをしたいと思うあなたの文書が名前空間を使用している場合、あなたはdeclare namespace ns="some_uri";

希望のように、あなたのXQueryステートメントに適切な名前空間宣言を持っている必要がありますこれは役に立ちます。
-tjw

関連する問題