我正在自学,发现了这个我无法理解的问题的答案。
给出以下 DTD:
<!DOCTYPE Courses [
<!ELEMENT Courses (Course*)>
<!ELEMENT Course (Subject, Students)>
<!ATTLIST Course CID ID #REQUIRED Credits PCDATA #REQUIRED>
<!ELEMENT Subject (#PCDATA)>
<!ELEMENT Students (Student+)>
<!ELEMENT Student EMPTY>
<!ATTLIST Student Name PCDATA #REQUIRED> ]>
[1] 我有一个 XPath 提示:
/Courses/Course[Students/Student/@Name="Smith"]/Subject
[2] 以及 XQuery 提示:
for $c in /Courses/Course
where every $s in $c/Students/Student satisfies $s/@Name="Smith"
return $c/Subject
答案声明 [2] 的结果始终包含在 [1] 中。有没有直观的解释?
根据我的理解,我认为这两个提示会输出相同的结果。
如果课程中的任何学生名为“Smith”,则您的 XPath 表达式 [1] 选择该课程。
如果课程中的每个学生都名为“Smith”,则您的 XQuery 表达式 [2] 将选择一门课程。
所以它们不等价。
[2]的结果始终是[1]的子集的命题依赖于这样一个事实:DTD不允许课程没有学生,或者学生没有名字。如果不是这种情况,那么 [2] 将选择一个空课程,而不是 [1]。