【问题标题】:xquery brackets without FLWOR没有 FLWOR 的 xquery 括号
【发布时间】:2009-12-05 15:31:07
【问题描述】:

您好,我有一个有点蹩脚的问题,但找不到答案。

如果我让构造函数括号无效会发生什么?

例如

{data(doc("somedata.xml")//node[0])}

我的意思是,我知道会发生什么,但是在解析时它被认为是什么?

是这样吗?

{
    for $i in "0"
    return
    data(doc("somedata.xml")//node[0])
}

【问题讨论】:

    标签: xquery


    【解决方案1】:

    一种常见的误解是,任何 XQuery 都是 FLWOR 表达式。当人们从 SQL 的角度处理 XQuery 并将其视为 SELECT 时,就会产生这种误解。

    事实上并非如此; FLWOR 表达式在许多方面只是另一个表达式。 FLWOR 表达式可能作为 SQL 表达式执行,但不一定是这种情况。

    XQuery 可以被视为一种函数式编程语言(如 Haskell),恰好有一些声明性结构(如 where 和 order by)。

    表达式1+2 只是一个将数字 1 和 2 相加的 XQuery 表达式,它周围不需要隐含的 FLWOR 表达式。

    如果您想在完全基于元组的代数中考虑 XQuery,那么您可以将输入视为单个空元组。我的意思是以下。

    看看这个查询:

    for $x in ...
    for $y in ...
    where $x/@name=$y/@name
    return $x
    

    如果您在基于元组的代数中考虑这一点,则 for 表达式的输入将是定义 $x$y 的元组流。很明显,这与数据库查询有何关联。这对应于一个包含两列 $x$y 的表,每对具有相同名称的一行。

    您可以考虑以下查询

    //foo
    

    在没有值的单个元组上进行操作。这有点像没有 fors 或 let 的 FLWOR 表达式(如果允许的话,只是一个 return 表达式)。在关系领域,这将是一个没有列和一行的表。然而,这只是一个逻辑抽象,大多数(如果不是全部)XQuery 实现仅将其表示为一个表达式。

    【讨论】:

      【解决方案2】:

      我不太明白你的问题。 “让构造函数括号无效”是什么意思?

      您给出的查询是一个节点,其内容是一个表达式。它被解析为这样。一个常见的误解是,每个表达式都是 FLWOR 表达式。 FLWOR 表达式只是另一个表达式。

      所以,

      <p> {data(doc("somedata.xml")//node[0])}</p>
      

      被简单地解析为

      <p> {data(doc("somedata.xml")//node[0])}</p>
      

      就像这样

      Console.WriteLine("foo");
      

      不被解释为

      foreach (int x in new string[] {"0"})
        Console.WriteLine("foo")
      

      在 C# 中。

      如果您想要完整的形式语义扩展,这是可以解释查询的一种方式,那么它看起来像这样:

      element {p}
      {
        fs:item-sequence-to-node-sequence(
          fn:data(
            fs:distinct-doc-order-or-atomic-sequence(
              let $fs:sequence :=
                fs:distinct-doc-order-or-atomic-sequence(
                  let $fs:sequence := doc("somedata.xml")
                  let $fs:count := count($sequence)
                  for $fs:dot at $fs:position in $fs:sequence
                  return $fs:dot/descendant-or-self::node())
              let $fs:count := count($fs:sequence)
              for $fs:dot at $fs:position in $fs:sequence
              return item-at($fs:dot/child::node, 0)
            )
          )
        )
      } 
      

      【讨论】:

      • 我用空括号表示的只是没有任何 FLWOR 结构的括号。 xquery 中的这样一个术语是否只是以相同方式解析的较长内容的较短版本?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多