【问题标题】:XQuery: How to check if two attributes have the same value?XQuery:如何检查两个属性是否具有相同的值?
【发布时间】:2015-01-25 20:23:49
【问题描述】:

假设我有如下两个元素:

(教师姓名='John' age='25')和(学生姓名='John' age='30)

我想知道哪些学生与其中一位老师同名,但年龄也比老师大。

这是我目前所拥有的:

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

          ($teacher/@name)
    else()

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

【问题讨论】:

  • 为了确保 XML 元素不会被解释为 HTML,请将它们包装在代码块中(例如,使用反引号)。阅读FAQ 了解详情。还请查看how to post an SSCCE 并提供格式良好的示例 XML 输入、当前输出(并解释其中的问题)和预期输出。
  • 并且您应该检查您的问题并使用左侧的复选标记标记那些解决了您的问题的答案(如果有这样做的答案)。这不仅向未来的访问者展示了您的问题是如何解决的,而且在一定程度上尊重了回答者的努力。

标签: mysql xml xquery


【解决方案1】:

所以,第一个问题是您的 XQuery 在语法上不正确。以美元符号开头的东西$ 表示变量,而// 是路径步骤。像 //$Teacher 那样组合变量和路径步骤是不正确的。因此,您的编译器应该已经抱怨了这一点。

下一个问题是你的逻辑有缺陷。你说你想得到所有的学生,但是你迭代了所有的老师。

此外,您的方法会失败,因为学生很可能是所有学生的集合,因此如果您搜索 $students/@age,您会得到 所有 年龄的集合。因此,如果您这样做两次(对于另一个属性,例如@name,则不能保证姓名和年龄属于同一个人。

因此,以下 XQuery 应该可以工作并返回预期结果:

$students/student[exists(
  let $s := .
  for $t in $teachers[@name = $s/@name and @age < $s/@age]
  return $s
)]

这样,您可以获得所有学生,其中至少有一位同名且年龄较小的老师。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多