gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:06:41 25 4
gpt4 key购买 nike

我有以下xmls:

样本1.xml

<root>
<subjectInfo>
<subject id="001"/>
<subject id="002" role="cross"/>
</subjectInfo>
</root>

样本2.xml

<root>
<subjectInfo>
<subject id="002"/>
<subject id="001" role="cross"/>
</subjectInfo>
</root>

我正在搜索值 id 的文档subject 的属性是“001”但 role (如果它在那里)相同的 subject元素不是“交叉”。所以,在我的例子中,结果应该包含 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>

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

最佳答案

正如@wst 所说,cts:not-query匹配两个文档。 cts:*查询匹配文档片段,而不是子树。您可以通过嵌套 cts:element-attribute-value-query 来匹配与您的条件相反的条件。 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 排除与此搜索匹配的文档。运算符(operator)。这将匹配 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-querycts:*-range-query从第一个 cts:search 中排除文档.

关于基于同一元素多个属性值的Marklogic查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25624066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com