0

我有以下 xml 文件

<data>
<element attribute="10">element1</element>
<element attribute="7">element2</element>
</data>

我在“元素”上创建了元素范围索引,在“属性”上创建了属性范围索引,并尝试执行以下查询:

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,因此相应地上面的片段不应该作为结果。

请帮忙。

4

1 回答 1

4

查询正在做它应该做的事情。它匹配 element=element1 和 element/@attribute<=7 的片段。对于示例 XML,这两种说法都是正确的。对于该 XML 中的同一元素,它们并非如此,但查询不能保证这一点。

这里的诀窍是记住索引指向片段。一般来说,这意味着整个文档匹配或不匹配。http://docs.marklogic.com/guide/search-dev/count_estimate#id_63216涉及到这个话题,http://developer.marklogic.com/blog/fragmented-thoughts也可能有帮助。

获得您想要的结果可能需要通过启用各种位置索引并将查询包装在cts:element-query. 或者您可能会重新考虑您的节点名称,以便它们对于此查询是片段唯一的。或者您可能会考虑设置片段根 - 但我认为这是最后的手段。

于 2013-01-23T18:59:36.903 回答