我是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。当我组合父节点时。如果父级和子级具有相同名称,则应为其添加计数值。
对于任何父母都不应该以递归方式完成。
答案 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
,它实际上使用键elem
对elem
进行分组