有人可以分解这个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节点。它有点工作,但它是重要的,我不知道为什么......也许如果我更好地理解这个循环我可以解决我的问题。
正如您在此处所见:索引:15,16和17是重复的。
谢谢!
答案 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
)以文档顺序出现在该节点之前。