我有一份文件
<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"))
但据我所知,在这种情况下,我将获得所有类别。
答案 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
作为其第四个参数来限制与其匹配的文档的域。