我有以下xml文件
<data>
<element attribute="10">element1</element>
<element attribute="7">element2</element>
</data>
我在“element”上创建了元素范围索引,在“attribute”上创建了属性范围索引,并尝试执行以下查询:
cts:search(collection(), cts:and-query((
cts:element-range-query(xs:QName("element"), "=", "element1")
cts:element-attribute-range-query(xs:QName("element"), xs:QName("attribute"), "<=", 7)
)))
现在它给我上面的片段作为结果,但实际上“element1”的属性是10大于7,所以上面的片段不应该作为结果。
请帮忙。
答案 0 :(得分:4)
查询正在做它应该做的事情。它匹配element = element1和element / @ attribute&lt; = 7的片段。这两个语句都适用于示例XML。对于XML中的相同元素,它们不是真的,但查询并不能保证这一点。
这里的技巧是记住索引指向片段。通常,这意味着整个文档匹配或不匹配。 http://docs.marklogic.com/guide/search-dev/count_estimate#id_63216涉及此主题,http://developer.marklogic.com/blog/fragmented-thoughts也可能有所帮助。
获得您想要的结果可能涉及通过启用各种位置索引并将查询包装在cts:element-query
中来做一些聪明的事情。或者您可以重新考虑您的节点名称,以便它们对此查询是片段唯一的。或者您可以考虑设置片段根目录 - 但我认为这是最后的手段。