Vous pouvez émuler la position()
fonction en comptant le nombre de nœuds frères précédant chaque nœud :
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)
Voici le jeu de résultats :
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
Comment ça marche :
- Le
for $i in .
la clause définit une variable nommée$i
qui contient le nœud courant (.
). Il s'agit essentiellement d'un hack pour contourner le manque de XQuery d'uncurrent()
de type XSLT fonction. - Le
../*
expression sélectionne tous les frères et sœurs (enfants du parent) du nœud actuel. - Le
[. << $i]
le prédicat filtre la liste des frères et sœurs à ceux qui précèdent (<<
) le nœud courant ($i
). - Nous
count()
le nombre de frères et sœurs précédents, puis ajoutez 1 pour obtenir la position. De cette façon, le premier nœud (qui n'a pas de frères et sœurs précédents) se voit attribuer une position de 1.