很抱歉,问题中的语法是错误的。
问题: 假设下面的XML是问题的示例XML。
XML:
<publishers>
<aa>
<name>aaaaa</name>
<address>aaa addr</address>
</aa>
<bb>
<name>bbbb</name>
<address>bbb addr</address>
</bb>
</publishers>
我想在父元素为<name>
<aa>
元素下执行搜索
但它不应该考虑<name>
<bb>
元素
MarkLogic有没有办法做同样的事情。
我知道几种方法(如下所列),但我正在寻找其他一些选择。
<aa>
和<bb>
元素定义不同的命名空间,并使用cts:element-value-query()
方法。cts:search
中将第一个参数定义为fn:doc()//aa
答案 0 :(得分:2)
最简单的方法可能是使用 cts:element-query ,这会创建尊重元素层次结构的查询。
在您的示例中,此查询将搜索您想要的任何名称&#34; name&#34;属于&#34; aa&#34;元素,忽略&#34;名称&#34;其他地方的元素。
cts:element-query(xs:QName("aa"),
cts:element-value-query(xs:QName("name"), "whatever")
)
当然cts:可以嵌套元素查询调用以创建更复杂的树约束。
另一种方法是使用 cts:path-range-query , 虽然这是否是一个好的方法取决于你究竟想要做什么。它需要一个范围索引,用于指向要包含在搜索中的aaa / name元素的每个路径。
cts:path-range-query("/publishers/aa/name", "=", "whatever")
答案 1 :(得分:0)
您不清楚是否只想返回元素的值,或者仅使用它来优化搜索条件。
另一种选择是使用字段并在那里定义路径,然后使用field-value-query或field-word-query。如果您希望获得更高的性能,您仍然可以在事后为此解决方案添加范围索引。