我有以下XML输入
<foo>
<bar a=1 b=25/>
<bar a=2 b=30/>
<bar a=1 b=35/>
<bar a=2 b=40/>
<foo>我需要得到以下结果
<foo>
<bar a=1>average of b = 30</bar>
<bar a=2>average of b = 35</bar>
<foo>我很难做一件有价值的事。
我有过
<foo>
{for $e in doc(XXX.xml)/foo/bar
return
<bar a="distinct-values(data($e/@a))">
{for $c in distinct-values(data($e/@a))
return avg(data($e/@b))}
</bar>}
</foo>我遗漏了什么?
发布于 2015-11-02 18:52:04
如果您的XQuery处理器支持XQuery 3.0,您可以使用group by结构,它正是为这种用例而设计的,在我看来,阅读起来要好得多:
<foo>{
for $el in doc(XXX.xml)/foo/bar
let $a := $el/@a
group by $a
return
<bar a="{$a}">average of b = {avg($el/@b)}
</bar>
}
</foo>它根据a属性对每个bar元素进行分组,并计算(并输出) b属性的平均值。
发布于 2015-11-02 17:30:14
我希望这就是你要找的。
let $doc := <foo>
<bar a="1" b="25"/>
<bar a="2" b="30"/>
<bar a="1" b="35"/>
<bar a="2" b="40"/>
</foo>
let $result := <foo>
{for $a in fn:distinct-values($doc//bar/@a)
for $b in avg($doc//bar[@a=$a]/@b)
return
<bar a="{$a}">
averge of b = {$b}
</bar>
}
</foo>
return $result 适当的for循环就可以了。
https://stackoverflow.com/questions/33467630
复制相似问题