使用XPath或XQuery,如何选择出现另一个节点最多的节点?
例如,我如何找到鸡蛋最多的篮子?
<basket name="1">
<egg></egg>
<egg></egg>
</basket>
<basket name="2">
<egg></egg>
</basket>
<basket name="3">
<egg></egg>
<egg></egg>
<egg></egg>
<egg></egg>
</basket>
答案 0 :(得分:3)
这是一个解决方案(TIMTOWTDI):
let $nodes := <xml>
<basket name="1">
<egg></egg>
<egg></egg>
</basket>
<basket name="2">
<egg></egg>
</basket>
<basket name="3">
<egg></egg>
<egg></egg>
<egg></egg>
<egg></egg>
</basket>
</xml>
let $max := max(for $c in $nodes//basket return count($c/egg))
return $nodes/basket[count(egg) = $max]
答案 1 :(得分:1)
这是一个XPath 2.0表达式和一个XQuery,用于选择想要的元素:
/*/basket[egg[max(/*/basket/count(egg))]]
基于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:sequence select="/*/basket[egg[max(/*/basket/count(egg))]]"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(您提供的XML片段,包装到单个顶部元素中以成为格式良好的XML文档):
<t>
<basket name="1">
<egg></egg>
<egg></egg>
</basket>
<basket name="2">
<egg></egg>
</basket>
<basket name="3">
<egg></egg>
<egg></egg>
<egg></egg>
<egg></egg>
</basket>
</t>
评估XPath表达式并将评估结果复制到输出:
<basket name="3">
<egg/>
<egg/>
<egg/>
<egg/>
</basket>
请注意:
没有“节点,其他节点出现次数最多”。
实际上,根据实际的XML文档,可能有许多元素包含相同的最大数量的其他元素。
如果您只想获得一个这样的元素,请说明文档顺序中的第一个元素,然后使用:
/*/basket[egg[max(/*/basket/count(egg))]][1]
答案 2 :(得分:0)
<xml>
<basket name="1">
<egg></egg>
<egg></egg>
</basket>
<basket name="2">
<egg></egg>
</basket>
<basket name="3">
<egg></egg>
<egg></egg>
<egg></egg>
<egg></egg>
</basket>
</xml>
你可以尝试像那样的XPath
xml/basket[
count(egg) > count(following-sibling::*/egg) and
count(egg) > count(preceding-sibling::*/egg)
]
或者如果你不仅要计算蛋元素
xml/basket[
count(child::*) > count(following-sibling::*/child::*) and
count(child::*) > count(preceding-sibling::*/child::*)
]