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
仕組み:
- $iの
for $i in .句は、$iという名前の変数を定義します 現在のノード(for $i in .)。これは基本的に、XQueryにXSLTのようなcurrent()がないことを回避するためのハックです。 機能。 -
../*式は、現在のノードのすべての兄弟(親の子)を選択します。 [. << $i]述語は、兄弟のリストを前の兄弟のリストにフィルターします(<<)現在のノード($i。-
count()先行する兄弟の数を入力し、1を加算して位置を取得します。このようにして、最初のノード(先行する兄弟がない)に1の位置が割り当てられます。