搜索marklogic中没有特定元素的xmls

时间:2017-04-06 09:32:08

标签: marklogic marklogic-8

假设我已在数据库中插入了以下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查询,该查询会将<entry>节点返回<vol> 1212 &amp; <title> title1 &amp;不应该有<isbn>元素。

对于上面的xml,输出应为。

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

2 个答案:

答案 0 :(得分:3)

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

您需要使用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!

答案 1 :(得分:0)

尝试,但你也会得到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>