2010-11-18 5 views
3

Je possède ce xml:Comment grouper des éléments basés sur l'attribut dans xquery?

<all> 
    <a> 
     <b x="i" al="kl"/> 
     <b x="j" al="ml"/> 
     <b x="k" al="jl"/> 
     <b x="j" al="pl"/> 
     <b x="j" al="il"/> 
     <b x="i" al="dl"/> 
    </a> 
    <a> 
     <b x="i1" al="kl"/> 
     <b x="j2" al="ml"/> 
     <b x="k3" al="jl"/> 
     <b x="j2" al="pl"/> 
     <b x="j2" al="il"/> 
     <b x="i3" al="dl"/> 
    </a> 
</all> 

Ce que je veux vraiment faire est pour chacun un élément que je dois groupe b par @x. Ainsi, le résultat ressemble à:

<a x="j"> 
<b x="j" l="ml"/> 
<b x="j" l="pl"/> 
... 
</a> 
<a x="i"> 
    <b x="i" al="kl"/> 
    <b x="i" al="dl"/> 
</a> 
... 
... 
... 

Répondre

4

Ce XQuery:

element result { 
    for $a in /all/a 
    return for $x in ($a/b/@x)[index-of($a/b/@x,.)[1]] 
      return element a { 
        $x, 
        $a/b[@x eq $x] 
       } 
} 

Sortie:

<result> 
    <a x="i"> 
     <b x="i" al="kl"/> 
     <b x="i" al="dl"/> 
    </a> 
    <a x="j"> 
     <b x="j" al="ml"/> 
     <b x="j" al="pl"/> 
     <b x="j" al="il"/> 
    </a> 
    <a x="k"> 
     <b x="k" al="jl"/> 
    </a> 
    <a x="i1"> 
     <b x="i1" al="kl"/> 
    </a> 
    <a x="j2"> 
     <b x="j2" al="ml"/> 
     <b x="j2" al="pl"/> 
     <b x="j2" al="il"/> 
    </a> 
    <a x="k3"> 
     <b x="k3" al="jl"/> 
    </a> 
    <a x="i3"> 
     <b x="i3" al="dl"/> 
    </a> 
</result> 
+0

Bonne réponse, +1. –

+0

Merci pour l'exemple de travail, Alejandro. Définitivement, répondez. – user3111525

+0

@ user322034: Vous êtes bienvenu. –

1

Si votre processeur prend en charge XQuery 1.1 vous pouvez simplement utiliser group by:

let $all := 
    <all> 
    <a> 
     <b x="i" al="kl"/> 
     <b x="j" al="ml"/> 
     <b x="k" al="jl"/> 
     <b x="j" al="pl"/> 
     <b x="j" al="il"/> 
     <b x="i" al="dl"/> 
    </a> 
    <a> 
     <b x="i1" al="kl"/> 
     <b x="j2" al="ml"/> 
     <b x="k3" al="jl"/> 
     <b x="j2" al="pl"/> 
     <b x="j2" al="il"/> 
     <b x="i3" al="dl"/> 
    </a> 
    </all> 
for $a in $all/a 
for $b in $a/b 
let $x := string($b/@x) 
group by $x 
order by $x 
return 
    <a x="{$x}"> 
    {$b} 
    </a> 

Vous pouvez exécutez ce code sur http://try.zorba-xquery.com/

+0

+1 Pour le lien de test en ligne XQuery. –

+0

J'utilise Saxon, qui nécessite actuellement une expression group-by pour avoir une seule clause for, une seule clause let et une seule clause group-by. Mais merci pour la réponse de toute façon. +1 – user3111525

Questions connexes