2016-04-02 35 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> 

計算屬性構造器是非常有用的。