我想检索集合中的文档,这些文档满足给定元素没有特定子元素的要求。例如,从下面的两个“文档”中,我想选择doc 2,因为它有元素child,但是文档1,因为它没有。
Doc 1 :
<doc>
<element>
<child/>
</element>
</doc>
文档2 :
<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 :(得分:3)
我认为您需要同时使用not()和exists()来实现所需的结果。所以,我想你想做点什么:
for $item in collection('/db/collection') return
if (not(exists($item//child))) then $item
else ()
关于命名空间问题:如果您的文档使用命名空间,那么您应该在XQuery语句中使用正确的命名空间声明,例如declare namespace ns="some_uri";
希望这会有所帮助。
-tjw
答案 1 :(得分:0)
使用命名空间的xml文档时,似乎是eXist的XQuery引擎(1.2.6)中的一个错误,因为它适用于没有命名空间的文档,以及最新的svn快照。
长号。
答案 2 :(得分:0)
要解决这个问题,暂时如何:
for $item in collection('/db/collection')
return
if ($item//child) then
$item
else
()