2011-12-22 5 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、与えられた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:

更新:カウント値で結果を並べるようにクエリを変更しました。

+0

作品私にとって、多くの感謝! – ritzdiamond

+0

もう1つ質問がありますが、インスタンス数に応じて結果をどのように整理しますか? – ritzdiamond

+0

"order by"句を使用します。今更新された例を参照してください。 –

3

これは短い思えるだけのXPath 2.0式です:このXPath式が提供されるXML文書に対して評価され

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

は:

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

たかったです、正しい結果が得られます

blue 2 
red 1 
関連する問題