假设我有两个如下所示的元素:
(教师姓名='约翰'年龄= '25')和(学生姓名='约翰'年龄= '30)
我想知道哪些学生与其中一位老师的名字相同,但也比老师年长。
这是我到目前为止所做的:
for $teacher in //$Teacher
where $teacher/@name = //$Student/@name
return
if ( $teacher/@age < //$Student/@age) then
($teacher/@name)
else()
它没有产生正确的结果,我不知道为什么。有人可以帮帮我吗?
答案 0 :(得分:2)
所以,第一个问题是你的XQuery在语法上是不正确的。以美元符号$
开头的内容表示变量,而//
是路径步骤。像//$Teacher
一样组合变量和路径步骤是不正确的。因此,您的编译器应该已经抱怨过了。
下一个问题是你的逻辑是有缺陷的。你说你想要所有学生,但是你会迭代所有的老师。
此外,您的方法会失败,因为学生很可能是所有学生的一组,所以如果您搜索$students/@age
,您将获得所有年龄的集合。因此,如果您执行此操作两次(对于@name
等其他属性,则无法保证名称和年龄属于同一个人。
因此,以下XQuery应该可以工作并返回预期的结果:
$students/student[exists(
let $s := .
for $t in $teachers[@name = $s/@name and @age < $s/@age]
return $s
)]
通过这种方式,您可以获得所有学生,其中至少有一名教师姓名相同且年龄较小。