Как сгруппировать элементы на основе атрибута в xquery? - PullRequest
3 голосов
/ 18 ноября 2010

У меня есть этот 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>

Что я действительно хочу сделать, так это для каждого элемента a мне нужно сгруппировать элемент b по @x. Итак, результат выглядит так:

<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 ]

4 голосов
/ 18 ноября 2010

Это 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 голос
/ 18 ноября 2010

Если ваш процессор поддерживает 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 /

...