功能实现“元素没有这个孩子”?

时间:2009-07-31 07:29:47

标签: xquery

我想检索集合中的文档,这些文档满足给定元素没有特定子元素的要求。例如,从下面的两个“文档”中,我想选择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

此查询确切地返回具有子元素的文档。

是什么给出了?

3 个答案:

答案 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 
    ()