XML元素的聚合(总和,分组和唯一值)

时间:2015-08-27 12:06:53

标签: xquery

我是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>

我有父节点,其计数和名称为attr。当我组合父节点时。如果父级和子级具有相同名称,则应为其添加计数值。

对于任何父母都不应该以递归方式完成。

1 个答案:

答案 0 :(得分:2)

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

paket install --hard

代码的前半部分只是用示例输入声明变量。查询本身是一个元素模板,使用简单的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,它实际上使用键elemelem进行分组