XML 个元素的聚合(求和、分组和唯一值)

Aggregation of XML elements (sum, grouping and unique values)

我是 xquery 的新手。您能否建议使用 xquery 来获得以下输出 xml.

输入xml:

<elem count="4" name="ABC">
   <elem count="3" name="VAl_1">
   <elem count="1" name="VAl_2">
</elem>
<elem count="5" name="PQR">
   <elem count="2" name="VAl_1">
   <elem count="3" name="Val_3">
</elem>   

输出xml:

<elem count="9" name="ABC,PQR">
   <elem count="5" name="VAl_1">
   <elem count="1" name="VAl_2">
   <elem count="3" name="VAl_3">
</elem>

我有 parent 个节点,其属性为计数和名称。当我组合 parent 节点时。如果 parent 和 children 具有相同的名称,则应添加计数值。

对于 parent 中的任何一个,这应该以递归方式完成。

我做了一些假设,但以下至少解决了所述问题:

declare variable $input :=
   <input>
      <elem count="4" name="ABC">
         <elem count="3" name="VAl_1"/>
         <elem count="1" name="VAl_2"/>
       </elem>
      <elem count="5" name="PQR">
         <elem count="2" name="VAl_1"/>
         <elem count="3" name="Val_3"/>
       </elem>
   </input>/*;

<elem count="{ sum($input/@count) }"
      name="{ string-join(distinct-values($input/@name), ',') }">
{
   for $name in distinct-values($input/elem/@name)
   let $grp  := $input/elem[@name eq $name]
   return
      <elem count="{ sum($grp/@count) }" name="{ $name }"/>
}
</elem>

代码的前半部分只是用示例输入声明一个变量。查询本身是一个元素模板,使用简单的 sum()distinct-values() 调用来提供这两个属性。

有趣的部分是 for 循环。通过循环 @name 的不同值,然后为每个值选择所有具有相同值的 elem,它实际上使用键 @nameelem 进行了分组.