2011-12-22 28 views
2

我有以下內容的XML文件和屬性:如何統計XQuery中不同值的每個實例?

<element> 
<unit id="1" color="blue"/> 
<unit id="2" color="blue"/> 
<unit id="3" color="red"/> 
</element> 

我如何獲得的1計),每一個屬性顏色的不同事件和2)計數爲每個不同的發生?

到目前爲止,我都試過不同的值()計數()以及它們的組合,沒有運氣,有不同的屬性的數量或它們的數量結束,雖然我我喜歡得到兩個。

,我想獲得應該是這樣的結果的列表:

Blue 2 
Red 1 
+0

[DISTINCT,SUM,COUNT給定XML的DataTable](http://izlooite.blogspot.com/2010/10/how-to-distinct-sum-count-datatable-for.html) –

回答

7

該查詢應該做你想要什麼:

let $input := 
    <element> 
    <unit id="1" color="blue"/> 
    <unit id="2" color="blue"/> 
    <unit id="3" color="red"/> 
    </element> 

return 
    for $value in distinct-values($input/unit/@color) 
    let $count := count($input/unit[@color eq $value]) 
    order by $count descending 
    return concat($value," ",$count) 

這將產生以下輸出爲我MarkLogic:

blue 2 
red 1 

更新:我修改了查詢,所以它通過計數值命令結果。

+0

Works對我來說,非常感謝! – ritzdiamond

+0

還有一個問題,你將如何根據實例的數量來組織結果? – ritzdiamond

+0

您將使用「order by」子句。查看現在已更新的示例。 –

3

這僅僅是一個XPath表達式2,0似乎短

for $v in distinct-values(/*/*/@color) 
return 
    ($v, count(index-of(/*/*/@color, $v)), '&#xA;') 

當這個XPath表達式與提供的XML文檔評價:

<element> 
    <unit id="1" color="blue"/> 
    <unit id="2" color="blue"/> 
    <unit id="3" color="red"/> 
</element> 

通緝,會產生正確的結果

blue 2 
red 1 
相關問題