搜索在 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!
假设我在数据库中插入了以下 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!