如何在xquery中基于属性对元素进行分组?

时间:2010-11-18 15:17:31

标签: attributes grouping xquery

我有这个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>
...
...
...

2 个答案:

答案 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>

您可以在http://try.zorba-xquery.com/

上执行此代码