How to group elements based on attribute in xquery?
I have this xml:
<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>
What I really want to do is for each of them I need to group element b with @x. The result looks like this:
<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>
...
...
...
+3
2 answers
This 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]
}
}
Conclusion:
<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>
+4
user357812
source
shareIf your processor supports XQuery 1.1, you can simply use 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>
You can execute this code at http://try.zorba-xquery.com/
+1