Xquery “实现的功能”;元素没有此子元素“;?

Xquery “实现的功能”;元素没有此子元素“;?,xquery,Xquery,我想检索集合中满足给定元素没有特定子元素的文档。例如,从下面的两个“文档”中,我想选择doc2,因为它有元素子元素,但是doc1,因为它没有 文件1: 然而,由于某些原因,这并不起作用。我还尝试了各种组合的存在,序列函数等,但没有得到我想要的结果 要澄清的是,not($item//child)测试似乎没有达到我认为的效果。上面的查询返回集合中的每个文档,无论它是否包含元素。 然而,反过来是可行的: for $item in collection('/db/collection') where $

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

文件1:

然而,由于某些原因,这并不起作用。我还尝试了各种组合的
存在
,序列函数等,但没有得到我想要的结果

要澄清的是,
not($item//child)
测试似乎没有达到我认为的效果。上面的查询返回集合中的每个文档,无论它是否包含元素。 然而,反过来是可行的:

for $item in collection('/db/collection')
where $item//child
return $item
此查询准确返回具有子元素的文档


给出了什么?

似乎是eXist的XQuery引擎(1.2.6)在使用带名称空间的xml文档时存在的一个缺陷,因为它适用于没有名称空间的文档和最新的svn快照。

糟糕透了。

为了避开这个bug,现在来看看这个怎么样:

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

我认为您需要同时使用not()和exists()来实现所需的结果。所以,我想你应该做一些类似的事情:

for $item in collection('/db/collection') return
    if (not(exists($item//child))) then $item
    else ()
关于名称空间问题:如果文档使用名称空间,那么在XQuery语句中应该有适当的名称空间声明,比如
declarenamespace ns=“some_uri”

希望这有帮助。

-这真是太奇怪了。如果您改用
count($item//child)
,您会得到什么输出-0有什么输出吗?哦,顺便问一下,使用了哪个XQuery实现?我已经使用Saxon 9检查了这一点(使用
节点的简单序列,而不是
集合
),我看到了预期的结果,而不是您描述的结果。您的实际XML可能更复杂,或者您的查询没有编写好,或者您的实现有缺陷和/或不一致。请参阅下面的答案。无论如何谢谢你的帮助!(顺便说一句,在这种情况下,自己发布一个答案并将其标记为正确答案是“正确的行为”吗?如果没有得到答案,就会出现一个小通知,暗示这将是慷慨的……)
for $item in collection('/db/collection')
where $item//child
return $item
for $item in collection('/db/collection') 
return 
  if ($item//child) then
    $item
  else 
    ()
for $item in collection('/db/collection') return
    if (not(exists($item//child))) then $item
    else ()