Sie können position() emulieren Funktion durch Zählen der Anzahl der Geschwisterknoten, die jedem Knoten vorangehen:
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)
Hier ist die Ergebnismenge:
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
So funktioniert es:
- Der
for $i in .-Klausel definiert eine Variable namens$ider den aktuellen Knoten enthält (.). Dies ist im Grunde ein Hack, um das Fehlen eines XSLT-ähnlichencurrent()in XQuery zu umgehen Funktion. - Der
../*Der Ausdruck wählt alle Geschwister (Kinder des Elternknotens) des aktuellen Knotens aus. - Der
[. << $i]Prädikat filtert die Liste der Geschwister nach denen, die vorangehen (<<) der aktuelle Knoten ($i). - Wir
count()die Anzahl der vorangehenden Geschwister und addieren Sie dann 1, um die Position zu erhalten. Auf diese Weise wird dem ersten Knoten (der keine vorangehenden Geschwister hat) die Position 1 zugewiesen.