XQuery:如何检查两个属性是否具有相同的值?

时间:2014-11-27 09:35:46

标签: mysql xml xquery

假设我有两个如下所示的元素:

(教师姓名='约翰'年龄= '25')和(学生姓名='约翰'年龄= '30)

我想知道哪些学生与其中一位老师的名字相同,但也比老师年长。

这是我到目前为止所做的:

for $teacher in //$Teacher
    where $teacher/@name = //$Student/@name 
    return
    if (  $teacher/@age < //$Student/@age) then

          ($teacher/@name)
    else()

它没有产生正确的结果,我不知道为什么。有人可以帮帮我吗?

1 个答案:

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

通过这种方式,您可以获得所有学生,其中至少有一名教师姓名相同且年龄较小。