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

搜索marklogic中没有特定元素的XML,marklogic,marklogic-8,Marklogic,Marklogic 8,假设我已经在数据库中插入了下面的xml <root> <name>Dixit</name> <entry> <vol>1212</vol> <title>title1</title> <isbn> <value>123456</value> </isbn&g

假设我已经在数据库中插入了下面的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>

迪克西特
1212
标题1
123456
1212
标题1
我如何编写一个cts查询,它将返回
节点,其中
作为1212&
作为标题1&不应包含
元素

对于上述xml,输出应为

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

1212
标题1

尝试一下,但您也会得到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:search(//vol,cts:element查询(xs:QName(“vol”),“1212”),
cts:search(//title,cts:element查询(xs:QName(“title”),“title1”))
}

人们通常会使用
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)]
或者拆分文档以将每个
条目
另存为单独的文档。然后,
cts:not query
就可以工作了,并且提供了一个更方便的解决方案,可以很好地扩展


谢谢,目前我正在使用XPath。还有一个问题。如果cts:search返回的文档超过一百万个,那么使用xpath会很慢吗?xpath本身并不慢,但是想象一下数据库需要调出一百万个结果,并在这些结果上逐个执行xpath以找到正确的结果,这确实会很慢。因此,我建议将条目保存为单独的文档,这将提供更好的选项。。