首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不带FLWOR的xquery括号

不带FLWOR的xquery括号
EN

Stack Overflow用户
提问于 2009-12-05 23:31:08
回答 2查看 1.4K关注 0票数 3

嗨,我有一个很烂的问题,但是找不到答案。

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

例如:

代码语言:javascript
复制
{data(doc("somedata.xml")//node[0])}

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

是这样的吗?

代码语言:javascript
复制
{
    for $i in "0"
    return
    data(doc("somedata.xml")//node[0])
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-06 04:11:02

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

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

XQuery可以看作是一种函数式编程语言(比如Haskell),它恰好有一些声明性结构(比如where和order by)。

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

如果您希望在完全基于元组的代数中考虑XQuery,那么可以将输入视为单个空元组。这里我指的是以下几点。

看看这个查询:

代码语言:javascript
复制
for $x in ...
for $y in ...
where $x/@name=$y/@name
return $x

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

您可以考虑以下查询

代码语言:javascript
复制
//foo

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

票数 3
EN

Stack Overflow用户

发布于 2009-12-06 00:08:24

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

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

所以,

代码语言:javascript
复制
<p> {data(doc("somedata.xml")//node[0])}</p>

被简单地解析为

代码语言:javascript
复制
<p> {data(doc("somedata.xml")//node[0])}</p>

就像是

代码语言:javascript
复制
Console.WriteLine("foo");

不会被解释为

代码语言:javascript
复制
foreach (int x in new string[] {"0"})
  Console.WriteLine("foo")

在C#中。

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1852480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档