假设我已在数据库中插入了以下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>
答案 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>