XQuery或XPath表达式解释

时间:2014-06-09 13:05:56

标签: xml xpath

有人可以分解这个Xquery正在做什么吗?

'for $i in . return count(../*[. << $i])'

我可以说它是for循环,但我对../*[]感到困惑。我正在研究这个SQL代码。我试图从XML文件中提取列名称节点:

    SELECT distinct 
    Parent.Items.value('for $i in . return count(../*[. << $i])', 'int') as [Index],
    Parent.Items.value('local-name(../.)', 'varchar(100)') as 'ParentItem',
    Parent.Items.value('local-name(.)', 'varchar(100)') as 'ChildItem'
    FROM    dbo.MyFormResults
    CROSS APPLY xmlformfields.nodes('/form/*')  as Parent(Items)

我希望这个Xquery按照XML文件中的顺序迭代我的XML节点。它有点工作,但它是重要的,我不知道为什么......也许如果我更好地理解这个循环我可以解决我的问题。

enter image description here

正如您在此处所见:索引:15,16和17是重复的。

谢谢!

1 个答案:

答案 0 :(得分:3)

for $i in .

for $x in y return z表达式依次将变量$x分配给序列y中的每个项目并评估表达式z,返回一个序列,该序列是所有项目的串联评估z的结果,例如for $i in (1, 2, 3) return (2 * $i)会生成序列(2, 4, 6)

在这种情况下,序列y只是一个节点 - 它是在变量中捕获.的当前值的习惯用法,因此您可以在更深层的谓词中使用它,作为替代在XSLT之外使用XPath 2.0时的XSLT current()函数。

../*[. << $i]

<<运算符测试节点的相对位置,如果x << y在文档顺序x之前出现,则y为真。

因此,for $i in . return count(../*[. << $i])只是一种冗长的写作方式count(preceding-sibling::*) - 当前节点(.的兄弟元素数量,也称为$y )以文档顺序出现在该节点之前。