【发布时间】:2013-12-05 07:44:47
【问题描述】:
我正在尝试编写一个包含 2 个部分的 Xquery:
- 第一部分是 Xquery 中的一个函数,用于计算每个班级元素的学生人数。该函数的输入应该是一个班级元素,输出是参加该课程的学生人数。
- 在第二部分,我想要至少有一个学生的课程列表(为了找到每门课程的学生数量,我必须使用第一部分中的函数)。
输入 xml 文件如下所示:在输入文件中,我们有 3 个不同的元素:Student、Class 和 Course,它们相互关联。
<?xml version="1.0" ?>
<Report Date="1999-12-02">
<Students>
<Student StudId="s11">
<Name><First>John</First><Last>Doe</Last></Name>
<Status>U2</Status>
<CrsTaken CrsCode="CS308" Semester="F1997"/>
<CrsTaken CrsCode="MAT123" Semester="F1997"/>
</Student>
<Student StudId="s66">
<Name><First>Joe</First><Last>Public</Last></Name>
<Status>U2</Status>
<CrsTaken CrsCode="MAT123" Semester="F1997"/>
</Student>
</Students>
<Classes>
<Class>
<CrsCode>CS308</CrsCode><Semester>F1997</Semester>
<ClassRoster Members="s11"/>
</Class>
<Class>
<CrsCode>MAT123</CrsCode><Semester>F1997</Semester>
<ClassRoster Members="s11 s66"/>
</Class>
</Classes>
<Courses>
<Course CrsCode="CS308">
<CrsName>Software Engineering</CrsName>
</Course>
<Course CrsCode="MAT123">
<CrsName>ALgebra</CrsName>
</Course>
</Courses>
</Report>
这是我完成的代码。我写了一个函数,它有一个元素作为输入,并将返回一个整数作为学生人数。我还尝试为第二部分调用该函数。但是我的查询有问题。
declare function local:numstudents($e as element())as xs:integer
{for $s in doc('test')//Student
let $T:=$e[CrsCode/text()=$s/CrsTaken/@CrsCode and Semester/text()=$s/CrsTaken/@Semester]
where not(fn:empty($T))
return count($s) };
<Courses>
{for $co in doc('test')//Course,
$c in doc('test')//Class
where $co/@CrsCode=$c/CrsCode/text() and local:numstudents($c)>1
return <course CrsCode="{$co/@CrsCode}" num="{$co/CrsName/text()}" />}
</Courses>
问题在于返回序列而不是整数的函数部分。这是错误:(Single item expected, (1, 1) found)。我正在使用http://basex.org/products/live-demo/ 来测试我的xquery。有什么帮助吗?如果可能,请更正我的代码而不是编写新代码:)。这应该是一个简单的查询,但我不知道如何解决它:)
【问题讨论】: