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の順に返却されます。