基于同一元素的多个属性值的Marklogic查询
我有以下XML: sample1.xml基于同一元素的多个属性值的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
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
中排除文档,谢谢。那真的很有帮助,谢谢。这解释了很多。