搜索marklogic中没有特定元素的XML
假设我已经在数据库中插入了下面的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
<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以找到正确的结果,这确实会很慢。因此,我建议将条目保存为单独的文档,这将提供更好的选项。。