正如@wst所说,cts:not-query
匹配两个文档。cts:*
查询匹配文档片段,而不是子树。您可以通过嵌套来匹配与您的条件相反的条件cts:element-attribute-value-query
a 内部的构造函数cts:element-query
。这将匹配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")))))
也许您可以调整您的查询要求,这样就足够了。如果没有,您可以使用以下命令排除与此搜索匹配的文档except
操作员。这将匹配sample1.xml
:
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
获取与第二个匹配的文档的唯一 ID 的函数cts:search
,然后使用cts:not-query
and cts:*-range-query
从第一个文件中排除文件cts:search
.