Du kan emulera position()
funktion genom att räkna antalet syskonnoder som föregår varje nod:
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)
Här är resultatuppsättningen:
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
Så fungerar det:
för $i i .
sats definierar en variabel med namnet$i
som innehåller den aktuella noden (.
). Detta är i grunden ett hack för att komma runt XQuerys brist på en XSLT-liknandecurrent()
funktion.-
../* expression väljer alla syskon (barn till föräldern) till den aktuella noden. -
[. <<$i] predikat filtrerar listan över syskon till de som föregår ( <<
) den aktuella noden ($i
). - Vi
count()
antalet föregående syskon och lägg sedan till 1 för att få positionen. På så sätt tilldelas den första noden (som inte har några föregående syskon) positionen 1.