2

$p在哪里以及如何定义或创建?为什么它根本是节点的索引或位置?


来自书店示例w3schools 的输入。

输出:

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

询问:

xquery version "3.1";

let $doc := db:open("bookstore")
let $books := $doc/bookstore/book

for $book at $p in $books 
where $p eq 2

return $book

是“at”为 $p 分配索引?然而,我的理解是 xpath 是声明性的而不是迭代的。然而,这至少类似于迭代。“at”可能不是迭代,而只是该节点在该文档中的位置?

也可以看看:

C#在规则中指定什么查询语言来拉出两个书节点

对于一个相关的问题。

4

3 回答 3

2

它可能类似于迭代,但它纯粹是功能性的。这是一个映射操作,其中(概念上)调用一个函数来处理输入序列中的每个项目;该函数使用两个参数调用,$x 是正在处理的项目,$p 是它在序列中的位置。处理顺序未定义 - 就您所知,这些项目可能全部并行处理或以相反顺序处理。

于 2020-12-16T19:38:41.947 回答
1

请参阅 W3.org XQuery 3.1 参考第 3.12.2 节 For Clause

在使用for ··· in构造的显式迭代中:

for $v [at $p] in e1
return e2

关于位置变量

定义:位置变量是前面有关键字 at 的变量。]​​ 位置变量可以与绑定在 for 子句中的变量相关联。在这种情况下,当主变量迭代其绑定序列中的项目时,位置变量迭代表示绑定序列中这些项目的序号的整数,从一开始。输出元组流中的每个元组都包含主变量和位置变量的绑定。如果绑定序列为空并且指定了允许为空,则输出元组中的位置变量将绑定到整数零。位置变量始终具有隐含类型 xs:integer。位置变量的扩展 QName 必须不同于与其关联的主变量的扩展 QName [err:

以下示例说明了位置变量将如何影响前面生成元组的示例的结果:

初始子句:

for $x at $i in (100, 200, 300)

输出元组流:

($x = 100, $i = 1)
($x = 200, $i = 2)
($x = 300, $i = 3)

所以,是的,at $p在显式迭代中创建变量,它也可以是$i或其他。(在 XPath 中,索引通常基于 1)。

于 2020-12-16T18:16:32.330 回答
1

XQuery(以及 XPATH 2.0+ 和 XSLT 2.0+)数据模型基于 ORDERED 序列。

$p 是 $x 在序列中的位置

在下面查看并感受它。

<root>
{
  for $x at $p in (10 to 20)
  where $x mod 2
  return <r pos='{$p}' value='{$x}' />
}
</root>

输出

<root>
  <r pos="2" value="11"/>
  <r pos="4" value="13"/>
  <r pos="6" value="15"/>
  <r pos="8" value="17"/>
  <r pos="10" value="19"/>
</root>
于 2020-12-16T16:40:59.700 回答