XML文書の任意の要素ノードまたはその要素ノードの属性ノードが持つ文字列を数値とみなしてソートすることができます。数値とみなしてソートするには、ソート式のキー指定に、単一行関数指定のval関数を指定します。val関数の引数には、テキスト式または属性式を指定します。
単一行関数指定の詳細については、“B.2.4 単一行関数指定”を参照してください。
例として以下の文書があるものとします。
文書A
<doc> <basic expense="7650円"> : </basic> <detail> : <taxi>1890円</taxi> : </detail> </doc>
文書B
<doc> <basic expense="12980円"> : </basic> <detail> : <taxi>11150円</taxi> : </detail> </doc>
文書C
<doc> <basic expense="出張費不要"> : </basic> <detail> : <taxi>3750円</taxi> : </detail> </doc>
文書D
<doc> <basic expense="480円"> : </basic> <detail> : <taxi>7400円</taxi> : </detail> </doc>
タクシー代(taxi)の安い順(昇順)にソートします。
val(/doc/detail/taxi/text())
結果:文書A、C、D、Bの順に返却されます。
出張費用(expense)の安い順(昇順)にソートします。
val(/doc/basic/@expense)
結果:文書C、D、A、Bの順に返却されます。
参考
テキスト式で指定したXML文書中のテキストノードの文字列に数字を含まない場合は、val関数はその値を0とみなします。この例では、文書Cの出張費用は0として扱われています。
また、テキスト式で指定したXML文書中のテキストノードがない場合は、そのXML文書は最後に返却されます。
数値の大きい順(降順)にソートしたい場合は、キー指定のあとに“DESC”を指定します。
タクシー代(taxi)の高い順(降順)にソートします。
val(/doc/detail/taxi/text()) DESC
結果:文書 B、D、C、Aの順に返却されます。
出張費用(expense)の高い順(降順)にソートします。
val(/doc/basic/@expense) DESC
結果:文書 B、A、D、Cの順に返却されます。