对元素值和元素属性的双重约束似乎不起作用

问题描述

假设我在ML中有这样的元素:

 <top-level-cote-mgt-rights>
    <token>SUPPORT</token>
    <token role="ADMIN">A/B/C</token>
    <token role="APPROVER">A/B/C</token>
    <token role="ADMIN">X/Y/Z</token>
    <token role="APPROVER">X/Y/Z</token>
    <token role="ADMIN">ADMIN/ONLY</token>
  </top-level-cote-mgt-rights>

以下查询旨在查找标记元素,其值均为“ ADMIN / ONLY ”且角色属性为“ APPROVER

let $uris := cts:uris('',(),cts:and-query((
  cts:collection-query('/test/data'),cts:element-query(xs:QName('top-level-cote-mgt-rights'),cts:element-query(xs:QName('token'),cts:and-query((
        cts:element-attribute-word-query(xs:QName('token'),xs:QName('role'),'APPROVER',('exact')),cts:word-query('ADMIN/ONLY',('exact'))
      ))
    )
  )
)))
return fn:doc($uris)//one:top-level-cote-mgt-rights

它不应该返回任何结果,但是它确实会返回

<top-level-cote-mgt-rights xmlns="http://one.oecd.org/one">
   <token>SUPPORT</token>
   <token role="ADMIN">A/B/C</token>
   <token role="APPROVER">A/B/C</token>
   <token role="ADMIN">X/Y/Z</token>
   <token role="APPROVER">X/Y/Z</token>
   <token role="ADMIN">ADMIN/ONLY</token>
</top-level-cote-mgt-rights>

好像它在“令牌”值和“令牌”属性上分别匹配,但与我尝试实现的相同“令牌”不同。

我在做什么错了?

解决方法

在这种情况下,您会期望使用cts:element-query产生误报:cts:element-query实际上会确定要在其中查找封闭查询的匹配元素的范围。 我的理解是cts以相关性/评分方式运行。

您可以使用查询跟踪来尝试/测试true | false是可组合查询(如果查询是直接的cts:element-attribute-value-query ,则不应期望误报)。

我建议两种解决方案:

使用本机XPath消除误报。

如果您希望采用MarkLogic方式,请尝试以下技术:

cts:search(
  fn:collection("/test/data")//one:top-level-cote-mgt-rights,cts:near-query(
    ( cts:element-attribute-value-query(xs:QName("one:token"),xs:QName("role"),"APPROVER","exact"),cts:element-value-query(xs:QName("one:token"),"ADMIN/ONLY","exact")
    ),0
  )
)
  • 如果case无关紧要,请删除"exact"
  • 您可以使用word positions索引对查询性能进行基准测试。