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

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

是什么给出了?

有帮助吗?

解决方案 2

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

其他提示

我认为您需要同时使用not()和exists()来实现所需的结果。所以,我想你想做点什么:

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

关于命名空间问题:如果您的文档使用命名空间,那么您应该在XQuery语句中使用正确的命名空间声明,例如 declare namespace ns =&quot; some_uri&quot ;;

希望这会有所帮助。 结果,-tjw

要解决这个问题,暂时如何:

for $item in collection('/db/collection') 
return 
  if ($item//child) then
    $item
  else 
    ()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top