我希望能够获得某种聚合,并将其作为我使用xquery返回的新属性。
目前我的代码如下:
for $x in //donors
where $x/donor[count(donations) > 5]
return <bigDonors>
<donor>
{$x/@donor_id}
{count($x/donor/donations)}
<name>{$x/donor/firstname}</name>
</donor>
</bigDonors>
我希望得到类似的内容:
<bigDonors>
<donor donor_id='xx123' numberDonations='5'>
<name>Bobbert Bobbily</name>
</donor>
.
.
.
</bigDonors>
我不知道如何将捐款数量作为属性。
答案 0 :(得分:2)
如果我们知道我们正在处理的源格式会更容易一些,所以我不得不做一些假设并使用这个测试XML片段:
<?xml version="1.0" encoding="UTF-8"?>
<donors>
<donor donor_id="tst01">
<firstname>Alice</firstname>
<donation value="2000"/>
<donation value="3000"/>
<donation value="4000"/>
</donor>
<donor donor_id="tst02">
<firstname>Bob</firstname>
<donation value="2000"/>
</donor>
</donors>
然后我使用了以下查询:
for $donor in //donors/donor
where $donor[count(donation) > 2]
return <bigDonors>
<donor donor_id="{$donor/@donor_id}" donations="{count($donor/donation)}">
<name>{$donor/firstname/text()}</name>
</donor>
</bigDonors>
要获得此结果:
<bigDonors>
<donor donor_id="tst01" donations="3">
<name>Alice</name>
</donor>
</bigDonors>
基本上,您的问题的解决方案是直接将您想要的属性写入结果标记,并使用包含在{}中的属性内的XPath表达式获取其内容。
答案 1 :(得分:0)
另一种选择是使用computed attribute constructor,如下所示:
for $x in //donors
where $x/donor[count(donations) > 5]
return <bigDonors>
<donor>
{attribute donor_id{$donor/@donor_id}}
{attribute donations{count($donor/donation)}}
<name>{$x/donor/firstname}</name>
</donor>
</bigDonors>
计算属性构造函数非常有用,尤其是当我们需要使用动态(计算)名称创建属性时。