XML文書の内容をソートしたい
XML文書の中に含まれているデータをソートして表示したいのですが、何か方法はありますか?。

回答/富士ソフトABC株式会社 技術調査室
2001/2/6

 XSLTのスタイルシートの定義を使用すると XML文書内のデータを簡単にソートすることができます。

 マイクロソフトの提供するXMLパーサ(MSXML)では同社が独自に定義している命令が幾つかあります。そのうちの“order-by”命令を使用するとXML文書内のデータをソートできます。使用する場合は、“for-each”や“apply-templates”と組み合わせて記述します。

 実際の記述例を以下に示します。

<xsl:for-each select="info" order-by="+no">

 このように“order-by”に続けて、昇順(+)か降順(−)を表わすフラグと、ソートに使用するタグを指定します。

 この方法は、あくまでマイクロソフトが独自に定義している命令を使用しているので、MSXMLをXMLパーサとして利用する環境に限定されます。

 もう1つ、W3CのXSLTの勧告で定義されている“sort”タグを使ってソートする方法もあります。こちらの方は正式にW3Cの勧告で定義されているタグなので、勧告に準じているXMLパーサであれば問題なく使用できます。

 このXSLTの勧告の機能をInternet Explorerの環境で使用する場合は、Microsoft XML Parser Version 3.0(MSXML3)をインストールする必要があります。

 この“sort”タグも“for-each”や“apply-templates”と組み合わせて記述します。ただし、“order-by”はタグの中に記述されたのに対し、“sort”は独立したタグとして、“for-each”や“apply-templates”タグの次に、子として記述します。

 実際の記述例を以下に示します。

<xsl:for-each select="info">
<xsl:sort select="no"/>

 このように“sort”タグを“select”に続けて記述し、ソートに使用するタグを指定します。昇順か降順かを指定する場合は、“select”の後ろに “order="descending"”と記述します。“descending”は降順、“ascending”を指定すると昇順になります。

 “sort”タグには幾つかの属性があり、書式は以下のようになっています。

<xsl:sort
    select = string-expression
    order = { "ascending" | "descending" }
    lang = { nmtoken }
    data-type = { "text" | "number" | qname-but-not-ncname }
    case-order = { "upper-first" | "lower-first" } />

  • select :
    ソートキーとなるタグを指定します。
  • order :
    文字列のソートを昇順または降順のどちらで行うかを指定します。“ascending”を指定すると昇順、“descending”を指定すると降順になります。指定しないと、デフォルト値として昇順(ascending)が選択されます。
  • lang :
    ソートキーの言語を指定します。このアトリビュート値の範囲は、xml:lang と同じです(xml:langについてはXMLの勧告の「2.12言語識別」を参照してください)。langの値が指定されていない場合には、システムの環境から言語を判定します。
  • data-type :
    文字列のデータ型を指定します。以下の値が使用できます。特に指定されない場合はデフォルトの値として“text”が使用されます。
    • text :
      ソートキーは lang で指定した言語において慣用的に認めている語順でソートされます。
    • number :
      ソートキーは数値に変換され、その値に従ってソートされます。ソートキーは、number 関数を呼び出したかのように数字に変換されます。この場合langアトリビュートは無視されます。
    • qname-but-not-ncname:
      ここでプレフィックス付きの QName を指定すると名前は展開されます(詳細はXSLTの勧告の「2.4 修飾名」を参照してください)。その展開された名前によってデータ型が識別されます。
  • case-order:
    値としては、“upper-first”または“lower-first”を指定します。data-type="text"を指定している場合だけ有効になり、大文字と小文字のどちらを優先すべきかを指定します。case-order="upper-first" を指定すると「A a B b」のように大文字が先のソート結果になり、case-order="lower-first" を指定すると「a A b B」のように小文字が先になります。デフォルト値は言語によって異なります。

 実際にXML文書内のデータを計算して、Webブラウザ上に表示するサンプルを紹介します。下記のサンプルは、MSXML3をインストールしたIE5.xで参照できます。

XML文書内のデータをソートして表示した例
「カテゴリでソート」ボタンと「価格でソート」ボタンをクリックと、それぞれの列でソートした結果が表示されます

 上記のサンプル画面は、下記のファイルによって試すことができます。

 ボタンをクリックすることでスタイルシートをダイナミックに切り替える方法の解説は、「スタイルシートをクリックで動的に切り替えたい」の項を参照してください。また、MSXML3については、「MSXML3とは何? 何が変わるの?」の項を参照してください。

 

「Ask XML Expert」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間