2012-12-02 31 views
2

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

這是一個解決方案(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] 
+0

使用XQuery偉大的工作,+1 –

+0

感謝這個! 我發佈的示例代碼比我需要解決的問題要複雜得多。這個解決方案是我最容易適應的解決方案。還感謝@dimitri和Roman – Jack

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::*) 
] 
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] 
相關問題