如何查找计数最高的节点?

时间:2012-12-02 19:52:18

标签: xml xpath xquery

使用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>

3 个答案:

答案 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::*)
]