首页 > 解决方案 > 在具有特定属性的元素中搜索值

问题描述

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

使用 cts:queries,我想在 mytype = "1" 的 elemZ 中找到 100 的myval。我没有看到任何允许cts:element-query并过滤属性的 cts 查询。即使 ancts:and-query似乎也没有帮助。

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

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

标签: xquerymarklogic

解决方案


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

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

这应该返回 mytype=1 和 myval text content = "100" 的 elemZ 的 myval 元素子项

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

   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。


推荐阅读