Xquery - 将聚合作为新属性返回

时间:2016-04-02 23:34:01

标签: xml xpath xquery

我希望能够获得某种聚合,并将其作为我使用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> 

我不知道如何将捐款数量作为属性。

2 个答案:

答案 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>

计算属性构造函数非常有用,尤其是当我们需要使用动态(计算)名称创建属性时。