XQuery:如何跨元素获取内部元素

XQuery: how to cross elements to get to the internal elements

<bookstore>

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<fortest>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>
</fortest>

</bookstore>

对于上面的例子,如果我想使用for语句获取所有<book>元素,我需要2个for语句:

for $x in doc("test.xml")/xs:bookstore/book
return $x

for $x in doc("test.xml")/xs:bookstore/fortest/book
return $x

我们能否跨过 <fortest> 标签,仅使用一个 for 获取 <bookstore> 内的所有 <book> 元素?

我认为 doc("test.xml")//book 可以。你可以在这里阅读它: http://www.w3schools.com/xsl/xpath_syntax.asp

正如另一个答案所指出的,您可以使用 // 到 select book 位于 任何级别深度 中的元素 bookstore

或者,如果您需要 XQuery 严格处理已发布的 2 个可能的结构,您可以像这样使用联合运算符:

for $x in doc("test.xml")/xs:bookstore/(self::xs:bookstore|fortest)/book
return $x

首先,注意for $x in EEE return $x可以简化为EEE

其次,我不知道您代码中的 "xs:" 前缀有什么用。

所以(改编和简化@har07 的答案)你可以这样写:

doc("test.xml")/bookstore/(.|fortest)/book