Du kan efterligne position()
funktion ved at tælle antallet af søskende noder forud for hver node:
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)
Her er resultatsættet:
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ådan virker det:
for $i i . klausul definerer en variabel ved navn $i
der indeholder den aktuelle node (.
). Dette er dybest set et hack til at omgå XQuerys mangel på en XSLT-lignendecurrent()
funktion.../* udtryk vælger alle søskende (børn af forælderen) af den aktuelle node. [. <<$i] prædikat filtrerer listen over søskende til dem, der går forud ( <<
) den aktuelle node ($i
).- Vi
count()
antallet af forudgående søskende og læg derefter 1 til for at få stillingen. På den måde tildeles den første node (som ikke har nogen forudgående søskende) en position på 1.