【问题标题】:How is "at" used in XQuery to find the position of a node?XQuery 中如何使用“at”来查找节点的位置?
【发布时间】:2020-12-16 16:14:34
【问题描述】:

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


来自 w3schools 的输入,bookstore 示例。

输出:

<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# What query language to specify in rule to pull out the two book nodes

一个相关的问题。

【问题讨论】:

    标签: xml xpath xquery basex flwor


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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>
      

      【讨论】:

        【解决方案3】:

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

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

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

        关于位置变量

        定义:位置变量是一个前面有 关键字 at。] 位置变量可能与 绑定在 for 子句中的变量。在这种情况下,作为主要 变量迭代其绑定序列中的项目, 位置变量迭代表示 绑定序列中这些项目的序号,以 一。输出元组流中的每个元组都包含两者的绑定 主变量和位置变量。如果绑定序列 为空并指定允许为空,位置变量在 输出元组绑定到整数零。位置变量 始终具有隐含类型 xs:integer。 a 的扩展 QName 位置变量必须与扩展的 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)。

        【讨论】:

          猜你喜欢
          • 2023-03-09
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多