2016-05-28 2 views
1

Abfrage bitte helfen Sie mir zu verstehen, wie diese Art von Abfrage mit xquery schreiben. Ich habe dieses .xml:xquery Hilfe, um Produkte und Benutzer von einem anderen Element Knoten

<auctions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<products> 
    <product id="1"> 
    <name>Name1</name> 
    </product> 
    <product id="2"> 
    <name>Name2</name> 
    </product> 
    <product id="3"> 
    <name>Name3</name> 
    </product> 
    <product id="4"> 
    <name>Name4</name> 
    </product> 
</products> 
    <users> 
<user username="Kukuk1"> 
</user> 
<user username="Kukuk2"> 
</user> 
<user username="Kukuk3"> 
    </user> 
</users> 
<bids> 
    <product id="1"> 
    <bid user="Kukuk1">400</bid> 
    <bid user="Kukuk2">410</bid> 
    <bid user="Kukuk1">450</bid> 
    </product> 
    <product id="2"> 
    <bid user="Kukuk3">200</bid> 
    <bid user="Kukuk2">300</bid> 
    </product> 
    <product id="3"> 
    <bid user="Kukuk1">150</bid> 
    </product> 
</bids> 
</auctions> 

und ich brauche diese Ausgabe zu erhalten, wie folgt: Der Benutzer „Kukuk1“ bekam die Produkte „Name1“ (mit dem Wert „450“) und „Name3“ (mit dem Wert "150). Der Benutzer" Kukuk3 "hat keine Produkte gewonnen. Der Benutzer" Kukuk2 "gewann die Produkte" Name2 ".

Die Elemente sollten von Benutzer aufsteigend sortiert werden und die Elemente Produkt nach Wert absteigend, sollte aussehen dies:

<got> 
    <user name="Kukuk1"> 
    <product value="450">Name1</product> 
    <product value="150">Name3</product> 
    </user> 
    <user name="Kukuk3"/> 
    <user name="Kukuk2"> 
    <product value="300">Name2</product> 
    </user> 
</got> 

Das ist, was ich habe, so weit:

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; 
declare option output:item-separator "&#xa;"; 
<got>&#xa;{ 
    for $u in (//auctions/users/user) 
    let $p:= //auctions/products 
    let $v := //auctions/bids/product 
    let $max1 := max($v/bid) 
    let $max2 := max($v/bid[4]) 
    let $got := //auctions/bids/product 
    let $won-product := $got[@id=$p/product/@id] 
    order by $u 
    return 
     if ($u/@username="Kukuk1") then 
       (<user name="{fn:string($u/@username)}"> 
&#xa;<product value="{$max1}">{fn:string($p/product[1]/name)}</product> 
&#xa;</user>,'&#xa;') 
     else 
      if 
      ($u/@username="Kukuk3") then 
       (<user name="{fn:string($u/@username)}"> &#xa;<product value="{$max2}">{fn:string($p/product[2]/name)}</product>&#xa;</user>,'&#xa;') 
      else 
       if 
        ($u/@username="Kukuk2") then 
         (<user name="{fn:string($u/@username)}"> 
&#xa;<product value="{$max2}">{fn:string($p/product[3]/name)}</product>&#xa; 
</user>,'&#xa;') 
       else() 

} 
</got> 

Und ich bin immer diese Ausgabe:

<got> 
<user name="Kukuk1"> 
    <product value="450">Name1</product> 
</user> 
<user name="Kukuk3"> 
    <product value="">Name2</product> 
</user> 
<user name="Kukuk2"> 
    <product value="">Name3</product> 
</user> 
</got> 

Antwort

0

Sie zwei müssen für Schleifen das Ergebnis Sie beschreiben, zu erreichen. In der äußeren Schleife werden Sie die Benutzer basierend auf ihrem jeweiligen Benutzernamen bestellen und in der inneren Schleife erhalten Sie die Gebote und ordnen sie nach ihrem höchsten Wert an.

Daher soll es in etwa so aussehen:

<got>{ 
    for $u in //auctions/users/user 
    let $username := $u/@username 
    order by $username 
    return element user { 
    $username, 
    for $product in //auctions/bids/product[bid/@user = $username] 
    let $highest-bid := max($product/bid) 
    order by $highest-bid descending 
    return 
     if ($product/bid[. = $highest-bid and @user = $username]) 
     then element product { 
     attribute {"value"} {$highest-bid}, 
     //auctions/products/product[@id = $product/@id]/name/string() 
     } else() 
    } 
}</got> 

Bitte beachten Sie, dass Ihr Beispiel Ausgang nicht Ihre Beschreibung als Kukuk3 > Kukuk2 paßt und deshalb um so sein sollte. Ich habe angenommen, dass deine Beschreibung korrekt ist.

+0

Vielen Dank, das ist eine Menge Hilfe. Der Kuku3 hat ein gültiges Gebot, aber er hat das Produkt nicht bekommen, weil sein Gebot 200 war und das Gebot von Kukuk2 300 war :) - wie bekomme ich diese Ausgabe, natürlich mit Zeilenumbrüchen ?: Name1 Name3 < Produktwert = "300"> Name2 xaoC

+0

@xaoC Ah, ich verstehe - das war nicht in Ihrem ursprünglichen Beitrag enthalten. Ich habe meine Anfrage entsprechend aktualisiert. Allerdings verstehe ich immer noch nicht, warum Kuku3 vor Kukuk2 ausgegeben werden sollte - Wenn Sie es auf etwas anderes als dem Namen, den Sie möglicherweise angeben möchten, bestellen möchten. Auch in Bezug auf Ihre aktualisierte Frage muss ich sagen, dass ich Ihre Anfrage nicht verstehe oder was Sie erreichen möchten - Es scheint, als wäre es sehr auf diesen kleinen Datensatz zugeschnitten, würde es keinen Sinn machen, es allgemeiner zu machen ohne Haben Sie 'if' für bestimmte Benutzernamen? – dirkk

+0

Ja, Sie haben recht mit dem kleinen Datensatz. Ich bin nur ein Anfänger und möchte xquery lernen. Meine schlechten mit den Namen - sie sollten so zu verstehen sein. Akuk = Kukuk1, Ckuk = Kukuk2, Bkuk = Kukuk3. – xaoC

Verwandte Themen