我有这个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>
我真正想做的是每个我需要通过@x对元素b进行分组。结果如下:
<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>
...
...
...
答案 0 :(得分:4)
这个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]
}
}
输出:
<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>
答案 1 :(得分:1)
如果您的处理器支持XQuery 1.1,您只需使用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>
上执行此代码