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
,它实际上使用键 @name
对 elem
进行了分组.
我是 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
,它实际上使用键 @name
对 elem
进行了分组.