我在Xquery中练习有问题。
这是练习:
如果所有课程的所有位置都已完成,那么每个教师每个月都会获得的(所有人的总和)将以迈克尔的名字开头。
这是xml文件:
<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 $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>
它列出了每月的利润,但我需要总利润,我不知道我该怎么做。我只使用“let”而不是“for”来尝试它,但这不允许我按价格乘以地方,我不知道为什么。有人可以帮帮我吗?非常感谢你。
答案 0 :(得分:2)
当您迭代每个课程时,您的$monthly-profits-by-course
将始终是单个值,而不是序列。因此,sum($monthly-profits-by-course)
将等于$monthly-profits-by-course
本身。你想要的是像每个老师一样返回一系列利润:
for $x in doc("LM")//course[starts-with(teacher, "Michael")]
return $y/places * $y/price
然后计算所有这些值的总和。结合起来,这看起来像:
let $all-sums :=
for $x in doc("LM")//course[starts-with(teacher, "Michael")]
return $y/places * $y/price
return sum($all-sums)
你可以简单地将其缩短为:
sum(
for $x in doc("LM")//course[starts-with(teacher, "Michael")]
return $y/places * $y/price
)
如果你的XQuery前任支持XQuery 3.0,你可以使用map !
运算符并写:
sum(doc("LM")//course[starts-with(teacher, "Michael")] ! (./places * ./price))