如何编写XQuery查询计算每门课程的成绩平均值?
正确的XQuery查询实现课程成绩平均值计算
给定的XML数据源
<?xml-stylesheet href="class3.xsl" type="text/xsl" ?> <school> <student> <name>Jack T</name> <course title="INF8430" note="78"/> <course title="INF1030" note="69"/> <course title="INF1230" note="85"/> </student> <student> <name>Marty L</name> <course title="INF8430" note="95"/> <course title="INF1030" note="82"/> <course title="INF1230" note="77"/> </student> <student> <name>Ben L</name> <course title="INF9430" note="59"/> <course title="INF1030" note="78"/> <course title="INF1230" note="79"/> </student> </school>
原有代码的问题
用户提供的代码无法正常运行,问题点如下:
- 文件名拼写错误:
tesst.xml多了一个s,应为test.xml(假设实际文件名为此) return语句后不能直接返回两个独立表达式,需将结果合并为一个节点结构- 标签语法错误:
<course title="{$s},"/></course>是无效写法,自闭合标签后无需额外添加闭合标签 - 未将
@note属性转换为数值类型,直接用avg()处理字符串可能导致计算异常
原有错误代码:
for $s in distinct-values(doc("tesst.xml")//course/@title) return avg(doc("tesst.xml")//course[@title=$s]/@note) <course title="{$s},"/></course>
正确的XQuery代码
<maliste> { for $courseTitle in distinct-values(doc("test.xml")//course/@title) let $notes := doc("test.xml")//course[@title = $courseTitle]/@note/xs:decimal(.) let $average := avg($notes) return <cours sigle="{$courseTitle}">{$average}</cours> } </maliste>
代码说明
- 外层包裹
<maliste>根节点,与期望输出结构匹配 - 使用
distinct-values()获取所有唯一的课程标题 - 将每个课程的
note属性转换为xs:decimal类型,确保数值计算准确 - 计算该课程所有成绩的平均值,生成对应的
<cours>节点,包含课程代码和平均值
正确输出(修正原期望输出笔误)
<maliste> <cours sigle="INF8430">86.5</cours> <cours sigle="INF1030">76.33333333333333</cours> <cours sigle="INF1230">80.33333333333333</cours> <cours sigle="INF9430">59</cours> </maliste>
注:原期望输出中INF9430的平均值39为笔误,数据源里只有Ben L的该课程成绩59,正确平均值应为59。
内容的提问来源于stack exchange,提问作者david9999
相关产品推荐
相关产品推荐

