2014-06-09 3 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() при «Работа с XPath 2.0 вне XSLT.

../*[. << $i] 

оператор << проверяет относительное положение узлов, x << y верно, если x предшествует y в порядке документа.

Поэтому for $i in . return count(../*[. << $i]) просто многословен способ записи count(preceding-sibling::*) - количество родственных элементов текущего узла (., который также известен как $y), которые приходят до этого узла в порядке документа.

+0

Спасибо! Что помогает! У вас есть идеи, почему я получаю дубликаты чисел? – user3281388

Смежные вопросы