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$i
der 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.