如何在 XQuery 中使用"at"来查找节点的位置?



$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

这是";在";它为$p分配一个索引?然而,我的理解是xpath是声明性的,而不是迭代的。然而,这至少类似于迭代。";在";也许不是迭代,而是该节点在文档中的位置?

另请参阅:

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

回答相关问题。

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

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

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

关于位置变量

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

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

初始条款:

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的(。

它可能类似于迭代,但它纯粹是功能性的。这是一个映射操作,其中(概念上(调用一个函数来处理输入序列中的每个项;该函数由两个参数调用,$x是正在处理的项,$p是它在序列中的位置。处理顺序没有定义——据你所知,这些项目可能都是并行处理的,也可能是反向处理的。

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>

最新更新