在具有特定属性的元素中搜索值

时间:2018-10-02 19:49:57

标签: xquery marklogic

<elemA>
  <elemZ mytype ="1">
    <myval>100</myval>
  </elemZ>
  <elemZ mytpe ="2">
    <myval>200</myval>
  </elemZ>
</elemA>

使用cts:queries,我想在 with mytype =“ 1”的elemZ中找到100的myval。我看不到任何允许cts:element-query且也可以过滤属性的cts查询。甚至cts:and-query似乎也没有帮助。

没有属性约束,元素值查询和两个元素查询将很容易工作。

cts:search(doc(), (some cts query?))

1 个答案:

答案 0 :(得分:3)

首先尝试使用这个简单的xpath -验证它是否有效,并且它对您来说性能是否足够。

//elemZ[@mytype=1]/myval[. = "100" ]

那应该返回elemZ的myval元素子元素,其mytype = 1且myval文本内容=“ 100”

要想做得更好(使用cts:query),将需要那些“可怕的”其他cts:查询和可能的一些范围索引。 大致:(未经测试)

   search(doc(),
     cts:element-query(xs:QName("elemZ"),
       cts:and-query((
         cts:element-attribute-value-query(xs:QName("elemZ"), xs:QName("mytype"), "1"),
         cts:element-value-query(xs:QName("myval"), "100") )) ) )

建议您从执行任何操作的最简单表达式开始,然后一个接一个地添加约束。

在您的情况下,可以想到查询优化器会将简单的xpath优化为适当的cts查询。值得尝试和评估性能。我个人喜欢从基本的xpath开始,然后根据需要仅按我的方式使用cts:query。