基于同一元素的多个属性值的Marklogic查询

基于同一元素的多个属性值的Marklogic查询,marklogic,Marklogic,我有以下XML: sample1.xml sample2.xml 我正在搜索subject的id属性值为“001”但同一subject元素的role(如果有)值不是“cross”的文档。因此,在我的示例中,结果应该包含sample1.xml而不是sample2.xml 我认为下面的查询可以完成这项工作: <code> cts:search(/root, cts:near-query(( cts:element-attribute-valu

我有以下XML:

sample1.xml

sample2.xml

我正在搜索
subject
id
属性值为“001”但同一
subject
元素的
role
(如果有)值不是“cross”的文档。因此,在我的示例中,结果应该包含
sample1.xml
而不是
sample2.xml

我认为下面的查询可以完成这项工作:

<code>
cts:search(/root,
        cts:near-query((
           cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001"),
           cts:not-query(cts:element-attribute-value-query(xs:QName("subject"),xs:QName("role"),"cross"))),0)

           )
</code>

但它没有(返回一个空序列)。请给我一个匹配的。

我认为问题在于
cts:not query
在两个文档上都匹配,因此将它们从结果集中排除

这可能不够,因为它不是一个仅索引的查询,但您可以通过过滤掉误报来补充
cts:search
结果:

cts:search(/root,
  cts:element-attribute-value-query(xs:QName("subject"), 
    xs:QName("id"), "001"))[subjectInfo/subject[@id='001' and not(@role='cross')]

正如@wst所说,
cts:not查询
匹配这两个文档<代码>cts:查询匹配文档片段,而不是子树。通过将
cts:element属性值查询
构造函数嵌套在
cts:element查询
中,可以匹配与条件相反的条件。这将匹配
sample2.xml

cts:search(/root,
  cts:element-query(xs:QName("subject"),
    cts:and-query((
      cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001"),
      cts:element-attribute-value-query(xs:QName("subject"),xs:QName("role"),"cross")))))
cts:search(/root,
  cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001"))

except

cts:search(/root,
  cts:element-query(xs:QName("subject"),
    cts:and-query((
      cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001"),
      cts:element-attribute-value-query(xs:QName("subject"),xs:QName("role"),"cross")))))
也许您可以调整查询要求,这样就足够了。如果没有,您可以使用
except
操作符排除与此搜索匹配的文档。这将匹配
sample1.xml

cts:search(/root,
  cts:element-query(xs:QName("subject"),
    cts:and-query((
      cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001"),
      cts:element-attribute-value-query(xs:QName("subject"),xs:QName("role"),"cross")))))
cts:search(/root,
  cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001"))

except

cts:search(/root,
  cts:element-query(xs:QName("subject"),
    cts:and-query((
      cts:element-attribute-value-query(xs:QName("subject"),xs:QName("id"),"001"),
      cts:element-attribute-value-query(xs:QName("subject"),xs:QName("role"),"cross")))))

如果文档具有唯一标识符,则可以添加范围索引,并使用
cts:-values
函数之一获取与第二个
cts:search
匹配的文档的唯一ID,然后使用
cts:notquery
cts:--range query
从第一个
cts:search
中排除文档,谢谢。那真的很有帮助,谢谢。这解释了很多。