2016-04-02 8 views
0

Ich möchte in der Lage sein, eine bestimmte Art von Aggregation zu erhalten und diese als neues Attribut in das zu setzen, was ich mit xquery zurückgebe.Xquery - Zurückgeben einer Aggregation als neues Attribut

Zur Zeit habe ich Code wie folgt:

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> 

Ich möchte wie etwas zurück zu bekommen:

<bigDonors> 
    <donor donor_id='xx123' numberDonations='5'> 
     <name>Bobbert Bobbily</name> 
    </donor> 
. 
. 
. 
</bigDonors> 

Ich weiß nicht, wie die Anzahl der Spenden als Attribut zu erhalten.

Antwort

2

Es wäre etwas einfacher gewesen, wenn wir das Quellformat wissen, mit denen wir arbeiten, so hatte ich ein paar Annahmen zu treffen, und für diesen Test verwendeten XML-Schnipsel:

<?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> 

hat mich dann die folgende Abfrage :

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> 

dieses Ergebnis zu erhalten:

<bigDonors> 
    <donor donor_id="tst01" donations="3"> 
    <name>Alice</name> 
    </donor> 
</bigDonors> 

Grundsätzlich ist die Lösung Ihrer i ssue sollte die gewünschten Attribute direkt in das Ergebnistag schreiben und deren Inhalt mithilfe von XPath-Ausdrücken innerhalb der in {} eingeschlossenen Attribute abrufen.

+0

Danke! Ich habe das ausprobiert, aber die Anführungszeichen nicht gesetzt, deshalb hat es nicht funktioniert. . heh – user3324536

0

wäre eine weitere Alternative verwendet werden computed attribute constructor etwa so: besonders

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> 

Berechnete Attributkonstruktor ist nützlich, wenn wir Attribut mit dynamischen (berechnete) Namen erstellen müssen.

Verwandte Themen