2014-06-09 72 views
0

有人可能會破壞這個Xquery的功能嗎?XQuery或XPath表達式解釋

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

我可以告訴它是一個循環,但我對../*[]混淆。這是我正在處理的這個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是重複的。

謝謝!

回答

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 current()功能,當你在XSLT之外使用XPath 2.0。

../*[. << $i] 

<<操作者測試節點的相對位置,x << y是真,如果x在文檔順序是:y之前。

因此for $i in . return count(../*[. << $i])是簡單地寫count(preceding-sibling::*)的冗長的方式 - 在文檔順序該節點之前落入當前節點(.,這也被稱爲$y)的同級元素的數量。

+0

謝謝!這有幫助! 你有什麼想法,爲什麼我得到重複的數字? – user3281388