XML文書中の任意の要素ノードまたはその要素ノードの属性ノードが持つ文字列でソートすることができます。文字列の大小関係は、文字列の文字コード値の大小関係です。文字列でソートする場合は、ソート式のキー指定にテキスト式、属性式または単一行関数指定のrlen関数を指定します。
キー指定の詳細については、“B.5.1 ソート式の書式”を参照してください。
例として以下の文書があるものとします。
文書A
<doc> : <namekana>たなかあいこ</namekana> : <basic date="2006年01月22日"> : </basic> <detail> : <destination area="東京都千代田区八重洲">東京営業所</destination> : </detail> : </doc>
文書B
<doc> : <namekana>すずきいちろう</namekana> : <basic date="2006年02月03日"> : </basic> <detail> : <destination area="大阪府大阪市阿倍野区阿倍野元町">大阪支店</destination> : </detail> : </doc>
文書C
<doc> : <namekana>すずきたろう</namekana> : <basic date="2006年01月13日"> : </basic> <detail> : <destination area="北海道札幌市中央区">北海道支店</destination> : </detail> : </doc>
文書D
<doc> : <namekana>さとうはなこ</namekana> : <basic date=""> : </basic> <detail> : <destination area="愛知県名古屋市千種区覚王山">愛知支店</destination> : </detail> : </doc>
氏名ひらがな(namekana)を昇順にソートします。
/doc/namekana/text()
結果:文書D、B、C、Aの順に返却されます。
出張日(date)の早い順(昇順)にソートします。
/doc/basic/@date
結果:文書C、A、B、Dの順に返却されます。
文字コードの大きい順(降順)にソートしたい場合は、キー指定のあとに“DESC”を指定します。
氏名ひらがな(namekana)を降順にソートします。
/doc/namekana/text() DESC
結果:文書A、C、B、Dの順に返却されます。
出張日(date)の遅い順(降順)にソートします。
/doc/basic/@date DESC
結果:文書B、A、C、Dの順に返却されます。
参考
XML文書中にテキスト式で指定したテキストノードがない場合は、“DESC”の指定の有無にかかわらず、そのXML文書は最後に返却されます。上記の例では、文書Dは、出張日の早い順でも遅い順でも最後に返却されます。
ポイント
文字列でソートする場合、文字列の先頭20バイトをキーにしてソートを実施します。このため、指定したキー指定の文字列の長さが20バイトよりも大きい場合、XML文書は20バイト目以降の文字で正しくソートされません。このような場合は、キー指定にrlen関数を指定して、先頭から何文字をソートキーとするかを指定できます。
rlen関数の詳細については、“B.2.4 単一行関数指定”を参照してください。
出張先(destination)でソートしたい場合
rlen(/doc/detail/destination/text(),10)
上記のように指定すると、出張先の先頭から10文字をソートキーとして利用します。
出張エリア(area)でソートしたい場合
rlen(/doc/detail/destination/@area,30)
上記のように指定すると、出張エリアの先頭から30文字をソートキーとして利用します。