搜索在 marklogic 中没有特定元素的 xml

search xmls which do not have particular element in marklogic

假设我在数据库中插入了以下 xml。

<root>
    <name>Dixit</name>
    <entry>
        <vol>1212</vol>
        <title>title1</title>
        <isbn>
            <value>123456</value>
        </isbn>
    </entry>
    <entry>
        <vol>1212</vol>
        <title>title1</title>
    </entry>
</root>

我如何编写一个 cts 查询,它将 return 我的 <entry> 个节点 <vol> 作为 1212 & <title> 作为 title1 并且不应包含 <isbn> 元素。

对于上面的 xml 输出应该是。

<entry>
    <vol>1212</vol>
    <title>title1</title>
</entry>

试试吧,但你也会得到 isbn,

cts:search(//entry,     
cts:and-query((cts:element-query(xs:QName("vol"), "1212"), 
cts:element-query(xs:QName("title"), "title1"))))

要完全避免 isbn,请进行两次 cts 搜索,

<entry> 
{
(cts:search(//vol, cts:element-query(xs:QName("vol"), "1212")),    
cts:search(//title, cts:element-query(xs:QName("title"), "title1")))
}
</entry>

人们通常会使用 cts:not-query(cts:element-query(xs:QName("isbn"), cts:true-query())) 来查找缺少 isbn 元素的情况,但不幸的是 cts:not-query 导致查询查看整个文档,并且由于您XML 文档有多个条目,一个有 isbn,一个没有,这不会给出您希望看到的结果。

您将需要 post-使用 XPath 手动过滤来自 cts:search 的结果,例如:

cts:search(
  //entry,
  cts:and-query((
    cts:element-query(xs:QName("vol"), "1212"), 
    cts:element-query(xs:QName("title"), "title1")
  ))
)[empty(isbn)]

或拆分文档以将每个 entry 保存为单独的文档。然后 cts:not-query 会工作,并提供更方便的解决方案,也可以很好地扩展。

HTH!