什么是元组和元组流?

ash*_*kan 0 xml xquery

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

<a>
    <b>
        <a/>
    </b>
    <c>
        <b/>
    </c>
</a>
Run Code Online (Sandbox Code Playgroud)

Leo*_*ler 9

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

请考虑对您的示例文档进行以下查询:

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

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

($elem = <b><a/></b>, $pos = 1),
($elem = <a/>,        $pos = 2),
($elem = <c><b/></c>, $pos = 3),
($elem = <b/>,        $pos = 4)
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

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