什么是元组和元组流?

时间:2014-04-26 13:39:57

标签: xml xquery

任何人都可以告诉我什么是"元组"和一个"元组流"?这个XML文档中有多少个元组?我们如何列出本文档中的前三个元组?

<a>
    <b>
        <a/>
    </b>
    <c>
        <b/>
    </c>
</a>

1 个答案:

答案 0 :(得分:9)

在XQuery规范中,这些术语专门用于描述FLWOR expressions的语义。由于您的示例不包含任何FLWOR表达式,因此不涉及任何元组。

在您的示例文档中考虑以下查询:

for $elem at $pos in /a//*
let $name := local-name($elem)
order by $name
return $pos

第一个for子句发出四个元组的元组流,每次迭代一个。每个元组都包含一个绑定,用于在范围内的FLWOR表达式中声明的每个变量:

($elem = <b><a/></b>, $pos = 1),
($elem = <a/>,        $pos = 2),
($elem = <c><b/></c>, $pos = 3),
($elem = <b/>,        $pos = 4)

let子句然后为每个元组添加$name的绑定,发出以下流:

($elem = <b><a/></b>, $pos = 1, $name = 'b'),
($elem = <a/>,        $pos = 2, $name = 'a'),
($elem = <c><b/></c>, $pos = 3, $name = 'c'),
($elem = <b/>,        $pos = 4, $name = 'b')

order by子句最终获取传入流,并根据绑定到$name的值重新排序元组。流看起来像这样:

($elem = <a/>,        $pos = 2, $name = 'a'),
($elem = <b><a/></b>, $pos = 1, $name = 'b'),
($elem = <b/>,        $pos = 4, $name = 'b'),
($elem = <c><b/></c>, $pos = 3, $name = 'c')

return子句返回绑定到$pos的值,因此FLWOR表达式的结果值为(2, 1, 4, 3)(如果(2, 4, 1, 3)order by,则为{{1}}不稳定)。