XSLTのソート結果行に番号を振りたい
XML文書内のデータをXSLTを利用してソートした結果、各行に番号を1から振りたいのですが、どうすればいいでしょうか

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

 XSLTを利用してXML文書内のデータをソートし、各データに番号を1から付けるのであれば、下記の命令を応用して記述することで番号付けできます。

<xsl:value-of select="position()"/>

 position()はコンテキストの位置を表わします。この場合、処理を行うカレントノードの位置を表わしています。

 もっとさまざまな表現を使用して番号付けを行うには、XSLTのnumber要素を使用し、番号を振りたい個所に以下のように記述することで実現できます。

<xsl:number value="position()" format="1"/>

 この記述は基本的なもので、1から順に番号付けを行っています。value="position()" 属性を指定しないと、ソート前の順番で番号付けされてしまいます。formatに使用できる値には、以下のものがあります。

設定値 概要
1 標準的な序数 (1、2、3……)
01 頭に任意の数の0を付した序数(01、02、03……、001、002、003……)
A 大文字のアルファベット(A-Z、AA-ZZ)
a 小文字のアルファベット(a-z、aa-zz)
I 大文字のローマ数字(I、II、III、IV……)
i 小文字のローマ数字(i、ii、iii、iv……)
全角カナの五十音 (ア、イ、ウ、エ、オ……)
全角カナのイロハ(イ、ロ、ハ、ニ……)

 また 、番号を“()” や“[]” で囲むこともできます。

<xsl:number value="position()" format="(1)"/>

 ““{}”はエラーにはなりませんが、内容は無視され“1”が指定された場合と同じ表示になります。

 ソートした結果に番号を付ける場合のXSLファイルの記述例を以下に示します。

<xsl:template match="doc">
<table align="center" border="2" width="700">
  ……
   <!-- info 要素がある限り繰り返して処理を行う -->
    <xsl:for-each select="info">
      <!-- price(価格)でソート -->
      <xsl:sort select="price" data-type="number"/>

       →要素 price を data-type="number" で、数値に変換してソートしています。

      <tr>
      <td width="80" align="center">

        <!-- 番号付け:i,ii,iii,vi と番号を付ける -->
        <xsl:number value="position()" format="i"/>

        →value="position()" で、ソート後のデータの順番で番号を付けます。番号は 1, 2, 3 ではなく、i, ii, iii で付けています。
      </td>
      ……
     </tr>
  </xsl:for-each>
</table>

 詳細はW3Cの勧告「XSLT 1.0」(http://www.w3.org/TR/xslt)の 7.7 項を参照してください。日本語訳はインフォテリアなどにあります(http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm)。

[サンプルファイル]
sort_sample.xml:XML データファイル
sort_style.xsl:ソートと番号付けを行うスタイルファイル (xsl:number を使用)

 

「Ask XML Expert」

 



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

注目のテーマ

HTML5+UX 記事ランキング

本日月間