2

我想检索集合中满足给定元素没有特定子元素的文档。例如,从下面的两个“文档”中,我想选择 doc 2,因为它有元素 child,但 doc 1,因为它没有。

文件 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

此查询准确返回具有子元素的那些文档。

是什么赋予了?

4

3 回答 3

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

于 2010-03-11T05:58:57.980 回答
0

在使用命名空间 xml 文档时,似乎是 eXist 的 XQuery 引擎 (1.2.6) 中的一个错误,因为它适用于没有命名空间的文档以及最新的 svn 快照。
真可惜。

于 2009-07-31T09:32:40.217 回答
0

为了解决这个错误,目前如何:

for $item in collection('/db/collection') 
return 
  if ($item//child) then
    $item
  else 
    ()
于 2009-08-25T10:44:51.990 回答