如何获取具有特殊属性值的元素的cts:值

Nik*_*ada 2 xquery marklogic

我有一份文件

    <document>
     <category selected="true">a</category>
     <category>b</category>
     <category selected="true">c</category>
    </document>
Run Code Online (Sandbox Code Playgroud)

如何才能获得[@selected eq'true']类别中的值?我试图使用下一个:

    cts:element-values(xs:QName("category"), (), (), cts:element-attribute-value-query(xs:QName("category"), xs:QName("selected"), "true"))
Run Code Online (Sandbox Code Playgroud)

但我明白在这种情况下我会得到所有类别.

Jus*_*eig 7

您cts:element-attribute-value-query()匹配具有属性为的category元素的所有文档.然后你返回的不同值的所有的的每个这些文件的内容,不管类是否有属性.selectedtruects:element-values()category@selected = 'true'

据推测,您希望从许多(可能是数亿个)类似结构的文档中获取值,而不仅仅是这个.对于一个文档,XPath会没问题的.但是,在整个数据库中,您需要一个范围索引才能有效地执行此操作.顾名思义,范围索引保留一组有序的值,并引用它们在内存中找到的文档.这使得在值范围内获得不同的值或计算非常有效.

使用范围索引,您可以使用cts:values()直接从索引中获取值,而无需自己读取文档.根据您的文档结构,您需要一个路径范围索引来区分选定的类别和未选择的类别.因此,您将创建一个路径范围索引category[@selected = 'true'],然后调用cts:values(cts:path-reference("category[@selected = 'true']")).cts:values()也可以使用a cts:query作为其第四个参数来限制值匹配的文档的域.