如何在Xquery中添加for循环?

时间:2017-05-04 14:09:34

标签: xquery

我在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”来尝试它,但这不允许我按价格乘以地方,我不知道为什么。有人可以帮帮我吗?非常感谢你。

1 个答案:

答案 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))