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

时间:2016-02-23 05:04:37

标签: xquery marklogic

我有一份文件

    <document>
     <category selected="true">a</category>
     <category>b</category>
     <category selected="true">c</category>
    </document>

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

    cts:element-values(xs:QName("category"), (), (), cts:element-attribute-value-query(xs:QName("category"), xs:QName("selected"), "true"))

但据我所知,在这种情况下,我将获得所有类别。

1 个答案:

答案 0 :(得分:7)

您的cts:element-attribute-value-query()符合category元素selected属性true的所有文档。然后,无论该类别是否具有cts:element-values()属性,您的category都会返回每个文档中@selected = 'true'个元素的所有的不同值。

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

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