2016-04-02 78 views
0

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

这本来是一个更容易一点,如果我们知道我们有,所以我不得不作出一些假设工作的源格式和本次测试使用的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> 

基本上解决你的我ssue是直接将所需的属性写入结果标签,并使用包装在{}中的属性内的XPath表达式获取其内容。

+0

谢谢!我试过,但没有放双引号,所以这就是为什么它不起作用。 。嘿嘿 – user3324536

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> 

计算属性构造器是非常有用的。