如何在Marklogic中对重复元素进行元素查询?

How to perform element query on a duplicate element in Marklogic?

抱歉,如果问题中的语法有误。

问题: 假设以下 XML 作为问题的示例 XML。

XML:

<publishers>
    <aa>
        <name>aaaaa</name>
        <address>aaa addr</address>
    </aa>
    <bb>
        <name>bbbb</name>
        <address>bbb addr</address>
    </bb>
</publishers>

我想在父元素为 <aa>

<name> 元素下执行搜索

但不应该考虑 <bb>

下的 <name> 元素

MarkLogic 中是否有任何方法可以做到这一点。

我知道执行此操作的几种方法(如下所列),但我正在寻找其他选择。

  1. 使用名称 space - 为 <aa><bb> 元素定义不同的名称 space 并使用 cts:element-value-query() 方法。
  2. cts:search中定义第一个参数为fn:doc()//aa

可能最简单的方法是使用 cts:element-query,它创建符合元素层次结构的查询。

在您的示例中,此查询将在属于 "aa" 元素的 "name" 元素中搜索您想要的任何名称,忽略其他地方的 "name" 元素。

cts:element-query(xs:QName("aa"),
  cts:element-value-query(xs:QName("name"), "whatever")
)

当然 cts:element- 可以嵌套查询调用以创建更复杂的树约束。

另一种方法是使用 cts:path-range-query, 尽管这是否是一个好方法取决于你到底想做什么。对于要包含在搜索中的 aaa/name 个元素的每个路径,都需要一个范围索引。

cts:path-range-query("/publishers/aa/name", "=", "whatever")

您不清楚您是只想 return 元素的值还是只是用它来优化您的搜索条件。

另一种选择是使用一个字段并在那里定义路径,然后使用 field-value-query 或 field-word-query。如果您需要更高的性能,您仍然可以向该解决方案添加范围索引 after-the-fact.