元素属性范围查询:通用名称问题及查询结果不符的解决方法
问题:如何在MarkLogic的cts查询中匹配元素属性与内容的组合条件?
示例XML
<book> <Title type="fiction">XYZ</Title> <Title type="horror">XYZ</Title> <Title type="comedy">ABC</Title> </book>
需求
筛选出同时包含以下两组条件的文档:
- 存在
Title元素,其type属性为fiction且内容为XYZ - 存在
Title元素,其type属性为comedy且内容为ABC
错误的查询代码
cts:and-query(( cts:element-attribute-range-query(xs:QName('Title'),xs:QName('type'),'=','fiction'), cts:element-attribute-range-query(xs:QName('Title'),xs:QName('type'),'=','comedy'), cts:element-range-query(xs:QName('Title'),'=','ABC'), cts:element-range-query(xs:QName('Title'),'=','XYZ') ))
问题原因
原查询用cts:and-query直接组合四个独立条件,这会要求同一个文档里存在满足所有四个条件的单个元素——但单个Title元素不可能同时拥有type="fiction"和type="comedy"属性,也不可能同时包含ABC和XYZ内容,因此无法返回预期结果。
正确解决方案
需要先将每组「属性+内容」的条件绑定到同一个元素上,再用外层cts:and-query确保两组条件同时满足,有两种实现方式:
方式1:使用cts:element-attribute-value-query绑定元素属性与内容
cts:and-query(( cts:element-attribute-value-query(xs:QName('Title'), xs:QName('type'), 'fiction', (), cts:element-value-query(xs:QName('Title'), 'XYZ')), cts:element-attribute-value-query(xs:QName('Title'), xs:QName('type'), 'comedy', (), cts:element-value-query(xs:QName('Title'), 'ABC')) ))
方式2:使用cts:element-attribute-range-query的嵌套参数绑定条件
cts:and-query(( cts:element-attribute-range-query(xs:QName('Title'), xs:QName('type'), '=', 'fiction', (), cts:element-range-query(xs:QName('Title'), '=', 'XYZ')), cts:element-attribute-range-query(xs:QName('Title'), xs:QName('type'), '=', 'comedy', (), cts:element-range-query(xs:QName('Title'), '=', 'ABC')) ))
关键说明
cts:element-attribute-value-query或cts:element-attribute-range-query的最后一个参数可以传入另一个cts查询,用来限定同一个元素同时满足属性和内容条件。- 外层
cts:and-query的作用是确保文档中同时存在两组符合要求的Title元素,而非要求单个元素满足所有条件。
内容的提问来源于stack exchange,提问作者anuj_gupta
相关产品推荐
相关产品推荐

