不带FLWOR的xquery括号

不带FLWOR的xquery括号,xquery,Xquery,嗨,我有一个有点蹩脚的问题,但找不到答案 如果我将构造函数括号保留为空,会发生什么 e、 g 我的意思是,我知道会发生什么,但是当被解析时,它被认为是什么 它是什么样子的 { for $i in "0" return data(doc("somedata.xml")//node[0]) } 我不太明白你的问题。你说的“让构造函数括号保持空白”是什么意思 您提供的查询是一个内容为表达式的节点。它被这样解析。人们普遍错误地认为每个表达式都是FLWOR表达式。FLWOR表达式

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

如果我将构造函数括号保留为空,会发生什么

e、 g

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

它是什么样子的

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

我不太明白你的问题。你说的“让构造函数括号保持空白”是什么意思

您提供的查询是一个内容为表达式的节点。它被这样解析。人们普遍错误地认为每个表达式都是FLWOR表达式。FLWOR表达式只是另一个表达式

所以

不被解释为

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)
      )
    )
  )
} 

人们普遍错误地认为任何XQuery都是FLWOR表达式。当人们从SQL的角度来处理XQuery时,就会产生这种误解,将其视为一种选择

事实并非如此;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
,每对都有一行具有相同的名称

你可以考虑下面的查询< /P>

//foo

在没有值的单个元组上操作。这有点像没有fors或lets的FLWOR表达式(如果允许的话,只是一个返回表达式)。在relational land中,这将是一个没有列和一行的表。然而,这只是一个逻辑抽象,大多数(如果不是全部的话)XQuery实现将其表示为一个表达式。

空括号中的内容只是没有任何FLWOR构造的括号。xquery中的这一术语是否只是以相同方式解析的较长术语的较短版本?
foreach (int x in new string[] {"0"})
  Console.WriteLine("foo")
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)
      )
    )
  )
} 
for $x in ...
for $y in ...
where $x/@name=$y/@name
return $x
//foo