在Marklogic中多次出现特定元素时,仅搜索那些XML

时间:2017-11-13 15:54:16

标签: xml xquery marklogic marklogic-9

我正在尝试在Marklogic中搜索具有元素<document>多次的文档XML。以下是我想要检索的一个这样的文档XML的结构:

<root>
    <documents>
        <document>
            <id>1</id>
            <name>roy</name>
            <otherData></otherData>
        </document>
        <document>
            <id>2</id>
            <name>roy</name>
            <otherData></otherData>
        </document>
        ....
        ...
        ..
        .
        <document>
            <id>3</id>
            <name>roy</name>
            <otherData></otherData>
        </document>

    </documents>
</root>

我不想检索具有以下结构的XML:

<root>
    <documents>
        <document>
            <id>3</id>
            <name>roy</name>
            <otherData></otherData>
        </document>
    </documents>
</root>

我可以使用element-query xs:QName("document")来搜索存在或最小存在,但不确定如何使用多个搜索进行搜索。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

没有真正简单的方法可以在MarkLogic中很好地扩展。最简单的方法是丰富文档,向<documents>元素添加count属性,并在每次触摸文档时使其保持最新。然后,您可以对count属性执行直接范围索引,并直接获取所需内容。

HTH!

答案 1 :(得分:1)

我喜欢接受的答案,但尝试使用cts:search和XPATH进行不同的操作。它比仅使用XPATH更快:

xquery version "1.0-ml";
let $query1:= cts:element-query(xs:QName("document"),cts:and-query( () )),
$query2:= cts:element-query(xs:QName("documents"),$query1)
return 
for $doc in cts:search(collection(),$query2,("unfiltered")) where count($doc/root/documents/document) > 1  return  $doc