2017-05-04 3 views
1

Ich habe ein Problem mit einer Übung in Xquery.Wie kann ich eine for-Schleife in Xquery hinzufügen?

Dies ist die Übung:

Man bekommt, was jeder Lehrer pro Monat (die Summe aller) Name mit Michael beginnt, das gewinnen würde, wenn alle Plätze seiner Kurse abgeschlossen wurden.

Und das ist die XML-Datei:

<shop> 
<training> 
    <course id="1"> 
     <name>Java</name> 
     <price fee="Monthly">27</price> 
     <places>20</places> 
     <teacher>Michael James</teacher> 
    </course> 
    <course id="2"> 
     <name>Android</name> 
     <price fee="Monthly">47</price> 
     <places>15</places> 
     <teacher>Michael Pit</teacher> 
    </course> 
    <course id="3"> 
     <name>SEO</name> 
     <price fee="Monthly">37</price> 
     <places>55</places> 
     <teacher>Michael Smith</teacher> 
    </course> 
    <course id="4"> 
     <name>HTML</name> 
     <price fee="Monthly">99</price> 
     <places>10</places> 
     <teacher>Michael Kit</teacher> 
    </course> 
    <course id="5"> 
     <name>CSS</name> 
     <price fee="Monthly">749</price> 
     <places>5</places> 
     <teacher>George Pet</teacher> 
    </course> 

ich, dies zu tun versuche:

` for $x in doc("LM")//course[starts-with(teacher, "Michael")] 
let $monthly-profits-by-course := $y/places * $y/price 
let $total-profits := sum($monthly-profits-by-course) 
return 
<courses> 
    <michael_profits>{$total-profits}</michael_profits> 
</courses>` 

Dies ist das Ergebnis:

<courses> 
<michael_profits>540</michael_profits> 
</courses> 
<courses> 
<michael_profits>705</michael_profits> 
</courses> 
<courses> 
<michael_profits>2035</michael_profits> 
</courses> 
<courses> 
<michael_profits>990</michael_profits> 
</courses> 

Es Liste s die monatlichen Gewinne natürlich, aber ich brauche die gesamten Gewinne und ich weiß nicht, wie kann ich das tun. Ich habe es nur mit "let" anstatt "for" versucht, aber das erlaubt mir nicht, die Plätze nach dem Preis zu multiplizieren, ich weiß nicht warum. Jemand könnte ich bitte helfen? Vielen Dank.

+0

Bitte geben Sie an, welchen Code Sie bereits ausprobiert haben. Befolgen Sie auch die anderen Hinweise in http://stackoverflow.com/help/how-to-ask. – BPS

Antwort

2

Ihr $monthly-profits-by-course wird immer ein einzelner Wert sein, keine Sequenz, wenn Sie über jeden Kurs iterieren. Daher wird sum($monthly-profits-by-course) gleich $monthly-profits-by-course selbst sein. Was Sie wollen, ist eine Folge der Gewinne von jedem Lehrer zurückkehren, wie Sie bereits getan:

for $x in doc("LM")//course[starts-with(teacher, "Michael")] 
return $y/places * $y/price 

Und dann die Summe aller dieser Werte zu berechnen. Zusammen würde dieses aussehen wie:

let $all-sums := 
    for $x in doc("LM")//course[starts-with(teacher, "Michael")] 
    return $y/places * $y/price 
return sum($all-sums) 

Und Sie können dies einfach verkürzen:

:

sum(
    for $x in doc("LM")//course[starts-with(teacher, "Michael")] 
    return $y/places * $y/price 
) 

Und wenn Ihr XQuery Präzessionsrads unterstützt XQuery 3.0 Sie können die Karte ! Operator und schreiben verwenden

sum(doc("LM")//course[starts-with(teacher, "Michael")] ! (./places * ./price)) 
+0

Es funktioniert perfekt. Danke dirk! – user7753413

Verwandte Themen