3

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

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

例如

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

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

是这样的吗?

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

2 回答 2

3

任何 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 表达式的输入将是定义$xand的元组流$y。很明显,这与数据库查询有何关联。这对应于一个具有两列$x$y一行的表,每对具有相同的名称。

您可以考虑以下查询

//foo

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

于 2009-12-05T20:11:01.723 回答
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")

在 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)
      )
    )
  )
} 
于 2009-12-05T16:08:23.633 回答