Можете да емулирате position()
функция чрез преброяване на броя братски възли, предхождащи всеки възел:
SELECT
code = value.value('@code', 'int'),
parent_code = value.value('../@code', 'int'),
ord = value.value('for $i in . return count(../*[. << $i]) + 1', 'int')
FROM @Xml.nodes('//value') AS T(value)
Ето набора от резултати:
code parent_code ord
---- ----------- ---
1 NULL 1
11 1 1
111 11 1
12 1 2
121 12 1
1211 121 1
1212 121 2
Как работи:
за $i в .
клауза дефинира променлива с име$i
който съдържа текущия възел (.
). Това е основно хак за заобикаляне на липсата на XQuery на XSLT-подобенcurrent()
функция.../*
изразът избира всички братя и сестри (деца на родителя) на текущия възел.- <кодът>[. <<$i] предикатът филтрира списъка с братя и сестри до тези, които предхождат (
<<
) текущия възел ($i
). - Ние
count()
броя на предишните братя и сестри и след това добавете 1, за да получите позицията. По този начин на първия възел (който няма предишни братя и сестри) се присвоява позиция 1.