2016-04-05 4 views
3
は、ので、ここで特定のXMLファイルの例タイトルに問題を説明するのは少し難しいです

特定の属性を持つ特定の要素の数をカウントし、コードが返すべきか:のXquery -

<objects> 
    <object type='Brick' to='Up' /> 
    <object type='Cross' to='Down' /> 
    <object type='Brick' to='Left' /> 
    <object type='Brick' to='Up' /> 
    <object type='Circle' to='Right' /> 
    <object type='Circle' to='Right' /> 
</objects> 

をだから私は持っていますBrich、Circle、Crossの3種類、Up、Down、Left、Rightの3種類があります。私は左、下、右用のサブ要素を取得したい、と彼らはそのオブジェクトタイプに対して表示される回数にまで、種類ごとに、基本的に

<objects> 
    <object type="Brick"> 
     <where to="Up" count="2" /> 
     <where to="Down" count="0" /> 
     <where to="Left" count="1" /> 
     <where to="Right" count="2" /> 
    </object> 
    <object type="Cross"> 
    . 
    . 
    . 
</objects> 

:私のような何かを得るためにXQueryを使用したいです。私は制限があるので、すべての単一のカウントをハードコードすることができ、多くのletステートメントがあることを知っていますが、私は誰かがこれを行うためのよりよい方法を示唆することを望んでいます。

+0

要素をグループ化するためにXQuery 3を使用できますか? –

+0

これをXquery 1.0で実行しようとしています –

答えて

2

がされ、完全に動的バージョン(ないハードコーディングしない)であるdistinct-values(...) XQuery 1.0のあなたの友人:

<objects>{ 
    let $directions := distinct-values(//@to) 
    for $type in distinct-values(//object/@type) 
    return <object type="{$type}">{ 
    for $to in $directions 
    return <where to="{$to}" count="{count(//object[@type = $type and @to = $to])}"/> 
    }</object> 
}</objects> 
0

オブジェクトの種類と方向がかなり静的でオブジェクトの数が多い場合、大きなシーケンスでは遅くなる可能性があるdistinct-valuesの代わりに、既知の値をリストする方がよいでしょう。

let $object-types := ('Brick', 'Circle', 'Cross') 
let $directions := ('Up', 'Down', 'Left', 'Right') 
for $t in $object-types 
return element object { 
    attribute type { $t }, 
    for $d in $directions 
    let $count := count($objects/object[@type = $t][@to = $d]) 
    return element where { 
    attribute to { $d }, 
    attribute count { $count } 
    } 
} 

しかし、あなたが先に時間の入力値を知ることができなかった場合は、動的などのそれらの値構築することができ:ここで

let $object-types := distinct-values($objects/object/@type) 
...