2009-12-05 55 views
3

嗨我有一个有点蹩脚的问题,虽然找不到答案。没有FLWOR的xquery括号

如果我离开构造方括号void,会发生什么?

例如

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

我的意思是,我知道会发生什么,但是什么时候被分析?

是不是像?

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

回答

3

这是一个普遍的误解,认为任何XQuery是一个FLWOR表达。当人们从SQL角度来看待XQuery时,这种误解就出现了,并将其视为SELECT。其实不是这样的;一个FLWOR表达式在很多方面只是另一个表达式。 FLWOR表达式可能是作为SQL表达式执行的,但不一定是这种情况。

XQuery可以被看作是一种函数式编程语言(就像Haskell),碰巧有一些声明式的构造(如where和order by)。

表达式1+2只是一个XQuery表达式,它添加了数字1和2,并不需要是一个隐含的FLWOR表达式。

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

看看这个查询:

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

如果你在一个基于元组的代数考虑这一点,输入表达将元组定义$x$y流。很明显,这可能与数据库查询有关。这对应于具有两列$x$y的表以及具有相同名称的每对的行。

你可以考虑以下查询

//foo 

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

0

我真的不明白你的问题。 “离开构造器括号无效”是什么意思?

您提供的查询是其内容为表达式的节点。它是这样解析的。每个表达式都是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") 

in 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) 
    ) 
    ) 
) 
} 
+0

什么我由空括号括起来只是括号没有任何FLWOR结构。 xquery中的这样一个术语只是一个更长的东西的短版本,而且是以相同的方式解析的? – Pyjong 2009-12-05 16:23:51