आप position()
. का अनुकरण कर सकते हैं प्रत्येक नोड से पहले सिबलिंग नोड्स की संख्या की गणना करके कार्य करें:
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)
यहाँ परिणाम सेट है:
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
यह कैसे काम करता है:
for $i in .
क्लॉज$i
. नाम के वेरिएबल को परिभाषित करता है जिसमें वर्तमान नोड शामिल है (.
) यह मूल रूप से XQuery के XSLT- जैसेcurrent()
की कमी के आसपास काम करने के लिए एक हैक है समारोह।- द
../*
अभिव्यक्ति वर्तमान नोड के सभी भाई-बहनों (माता-पिता के बच्चे) का चयन करती है। [. << $i]
predicate भाई-बहनों की सूची को फ़िल्टर करता है जो पहले आते हैं (<<
) वर्तमान नोड ($i
)।- हम
count()
पूर्ववर्ती भाई-बहनों की संख्या और फिर स्थिति प्राप्त करने के लिए 1 जोड़ें। इस तरह पहले नोड (जिसमें कोई पूर्ववर्ती भाई-बहन नहीं है) को 1 का स्थान दिया गया है।