2017-05-04 4 views
1

Xqueryで問題が発生しました。forループでXqueryをどのように追加できますか?

これは運動です:

は、すべての教師が毎月獲得なるか、名前が彼のコースのすべての場所が完了した場合には、マイケルから始まる(すべての合計)を取得します。

そして、これはXMLファイルです:

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

これが結果です:

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

それ、私はこれを行うにしようとしています

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

リストもちろん毎月の利益もありますが、私は総利益が必要です。私はそれをどうすればいいのか分かりません。私はそれを "for"の代わりに "let"だけを使って試しましたが、これは価格を使って場所を掛けることができません。理由はわかりません。誰か助けてくれませんか?どうもありがとうございます。

+0

あなたがすでに試したコードを含めてください。また、http://stackoverflow.com/help/how-to-askの他のアドバイスに従ってください。 – BPS

答えて

2

あなたの$monthly-profits-by-courseは常に1つの値であり、各コースで繰り返すシーケンスではありません。したがって、sum($monthly-profits-by-course)$monthly-profits-by-courseと同じになります。あなたが望むのは、あなたがすでに行ったように各教師が利益の系列を返すことです:そして、すべてのこれらの値の合計を計算してください。組み合わせると、これは次のようになります。

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

そして、あなたは、単純にこれを短縮することができます。あなたがマップ!演算子を使用して書くことができたXQuery 3.0

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

そして、あなたのXQuery precessorがサポートしている場合:

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

それは完璧に働いています。ありがとうdirkk! – user7753413

関連する問題