U kunt de position()
. emuleren functie door het aantal zusterknooppunten te tellen dat aan elk knooppunt voorafgaat:
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 is de resultatenset:
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
Hoe het werkt:
- De
for $i in .
clausule definieert een variabele met de naam$i
die het huidige knooppunt bevat (.
). Dit is eigenlijk een hack om XQuery's gebrek aan een XSLT-achtigecurrent()
te omzeilen functie. - De
../*
expressie selecteert alle broers en zussen (kinderen van de ouder) van het huidige knooppunt. - De
[. << $i]
predikaat filtert de lijst met broers en zussen naar de voorgaande (<<
) het huidige knooppunt ($i
). - Wij
count()
het aantal voorgaande broers en zussen en voeg vervolgens 1 toe om de positie te krijgen. Op die manier krijgt de eerste knoop (die geen eerdere broers en zussen heeft) een positie van 1.