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

Xquery XML元素的聚合(总和、分组和唯一值),xquery,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 co

我是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。当我合并父节点时。如果父项和子项具有相同的名称,则应为它们添加计数值


对于任何一位家长,这都应该以递归的方式进行。

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

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>
声明变量$input:=
/*;
{
对于不同值中的$name($input/elem/@name)
让$grp:=$input/elem[@name eq$name]
返回
}
代码的前半部分只是用示例输入声明一个变量。查询本身是一个元素模板,使用简单的
sum()
distinct-values()
调用来提供这两个属性


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

元素进行分组,如果您能解释您的代码的作用以及您的思想过程是什么,那将是非常棒的,因此OP和其他人不仅可以从一个代码片段中获益,还可以学习如何“在XQuery中思考”。嘿,Florent Georges,非常感谢:)事实上,我正在开发一个搜索引擎,它将返回一个XML结果集以及刻面结果。Facet只是结果集中特定值的计数。要求是我应该根据用户提供的名称合并结果计数。谢谢@dirkk。我认为这很简单,但至少分组是值得解释的。@Aniket,如果您需要修改示例(如果答案没有真正回答您的问题),请相应地修改您的问题。