gpt4 book ai didi

xpath - XQuery:如何知道是否有双峰?

转载 作者:行者123 更新时间:2023-12-03 16:04:10 24 4
gpt4 key购买 nike

我有 XML 文件有 <a><b>对于每个 element
我想使用 XQuery 编写查询以返回 True 或 False

有一个名为 <element> 的元素.

每个 <element>有 2 个元素 <a><b> .

返回错误:
如果有<a>与另一个 <a> 具有相同的值在另一个元素中 && 那里 <b>的值不同

否则为真:
<a>每个元素的值不同
或有相似之处,但有<b>值(value)观不同

例如

<root>
<element>
<a>ttt</a>
<b>tttsame</b>
</element>
<element>
<a>ttt</a>
<b>tttsame</b>
</element>
<element>
<a/>
<b>value</b>
</element>
<element>
<a>rrr</a>
<b>rrrvalue</b>
</element>
<element>
<a>mmm</a>
<b>rrrvalue</b>
</element>
<element>
<a>mmm</a>
<b>rrrvalue</b>
</element>
</root>

这个应该没问题
应该返回真
<root>
<element>
<a>ttt</a>
<b>ttt value</b>
</element>
<element>
<a>ttt</a>
<b>ttrdiff</b>
</element>
<element>
<a/>
<b>value</b>
</element>
<element>
<a>mmm</a>
<b>rrrvalue</b>
</element>
</root>

不应该被接受,因为 ttt 有两个不同的值
应该返回假

最佳答案

简单 XPath 2.0 :

empty(
(for $parentA-Dubled in /*/*[a = following-sibling::*/a]
return
empty($parentA-Dubled/following-sibling::*
[$parentA-Dubled/a eq a and $parentA-Dubled/b ne b])
)
[not(.)]
)

基于 XSLT 2.0 的验证:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/">
<xsl:value-of select=
"empty(
(for $parentA-Dubled in /*/*[a = following-sibling::*/a]
return
empty($parentA-Dubled/following-sibling::*
[$parentA-Dubled/a eq a and $parentA-Dubled/b ne b])
)
[not(.)]
)
"/>
</xsl:template>
</xsl:stylesheet>

当此转换应用于任何 XML 文档时,它会评估 XPath 表达式并输出此评估的结果 .

当应用于第一个提供的 XML 文档时,会产生所需的正确结果:
true

当应用于第二个提供的 XML 文档时,再次生成所需的正确结果:
false

解释 :

这个子表达式:
(for $parentA-Dubled in /*/*[a = following-sibling::*/a]
return
empty($parentA-Dubled/following-sibling::*
[$parentA-Dubled/a eq a and $parentA-Dubled/b ne b])

计算为一系列 bool 值: true()/ false() true()为真时返回:
empty($parentA-Dubled/following-sibling::*
[$parentA-Dubled/a eq a and $parentA-Dubled/b ne b])

这意味着 true()每次有 $parentA-Dubled/a 时返回没有其他的 a ( $parentA-Dubled 的下一个兄弟的 child ,其值与 $parentA-Dubled/a 相同,但其 b 兄弟的值与 $parentA-Dubled/b 的值不同。

总结 : true() 时返回全部 a具有相同值的元素,它们的 b sibling 也有(所有 b s)相同的值

那么 false()是什么时候被退回?

返回 false()表示 empty()返回 false() -- 即至少存在两个 a 的场合具有相同值的元素,但它们的 b sibling 有不同的值(value)观。

因此,上面的子表达式返回一个序列,例如:
true(), true(), true(), ..., true() -- 所有值为 true()
或者
true(), true(), true(), ..., false), ..., true() -- 至少有一个值为 false()
原问题需要我们返回 true()在第一种情况下,返回 false()在第二种情况下。

这很容易表达为:
empty($booleanSequence[. eq false()]) -- 这相当于较短的:
empty($booleanSequence[not(.)])
现在,我们只需要替换上面的表达式 $booleanSequence使用我们上面分析的第一个子表达式:
(for $parentA-Dubled in /*/*[a = following-sibling::*/a]
return
empty($parentA-Dubled/following-sibling::*
[$parentA-Dubled/a eq a and $parentA-Dubled/b ne b])

这样我们就得到了解决原始问题的完整 XPath 表达式:
empty(
(for $parentA-Dubled in /*/*[a = following-sibling::*/a]
return
empty($parentA-Dubled/following-sibling::*
[$parentA-Dubled/a eq a and $parentA-Dubled/b ne b])
)
[not(.)]
)

关于xpath - XQuery:如何知道是否有双峰?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58459312/

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