サンプルで覚えるXSLTプログラミング

4. テンプレート系XSLTエレメント

 テンプレート系エレメントは、テンプレートの宣言および呼び出しに関するタグ群です。 テンプレートとは、XSLTにおける処理のマクロだと考えていいでしょう。

 <xsl:template>、<xsl:apply-templates>および<xsl:call-template>について、それぞれ簡単な機能の概略と、おもな属性の紹介、これらのタグを利用した簡単な例を紹介します。


 テンプレートの定義
 <xsl:template>

属性名 属性値 機能
match XPath表現 処理中のノードにこのテンプレートが適応されるべきかどうかを吟味するための表現です。
name 文字列 テンプレートの名前です。
mode 文字列 “match”属性値の表現が同じ場合でも、“mode”属性を加えることで違うテンプレートを定義することができます。

“match”か“name”のいずれかの属性が必要で、両方が混在することは許されません。属性“match”は次の<xsl:apply-templates>と使われることを前提にしています。また属性“name”は<xsl:call-template>で呼び出されます。

例:<xsl:template match="/prefectures">
例:<xsl:template name="body">


 該当するテンプレートの適用
 <xsl:apply-templates>

属性名 属性値 機能
select XPath表現 処理中のノードに適応するテンプレートを選択するための表現で、必須です。
mode 文字列 “match”属性値の表現が同じ場合でも“mode”属性をくわえることで違うテンプレートを定義することができます。

<apply-templates>では、selectに指定された表現に当てはまる(マッチする)ごとに、該当するテンプレートが呼び出されます。この実際の例は後述します。

例:<xsl:apply-templates select="prefecture"/>
<xsl:apply-templates select="prefecture"/>

 指定されたテンプレートの呼び出し
 <xsl:call-template>

属性名 属性値 機能
name 文字列 テンプレートの名前です。

“name”で、呼び出すテンプレートを指定します。

例:<xsl:call-template name="body"/>


 それでは上記3つのタグの使用例をみてみましょう。今回は、日本の都道府県についてのデータ(都道府県名、県庁所在地、面積、人口)が記述されたXML文書「prefecutres.xml」を使用します。これをスタイルシートでさまざまな形に加工していきましょう。

prefectures.xml(元になるXML文書)

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="prefecturesX.xsl"?>
<prefectures>
  <prefecture id="1">
  <name>北海道</name>
  <capital>札幌</capital>
  <area unit="sqkm">78420</area>
  <population>5691737</population>
</prefecture>
<prefecture id="2">
  <name>青森県</name>
  <capital>青森</capital>
  <area unit="sqkm">9606</area>
  <population>1504358</population>
</prefecture>

……中略……


<prefecture id="46">
  <name>鹿児島県</name>
  <capital>鹿児島</capital>
  <area unit="sqkm">9186</area>
  <population>1790437</population>
</prefecture>
<prefecture id="47">
  <name>沖縄県</name>
  <capital>那覇</capital>
  <area unit="sqkm">2266</area>
  <population>1313804</population>
</prefecture>
</prefectures>

 まずはシンプルに、上記の都道府県名を順番どおりに表示してみます。「1.XSLTによるHTMLへの変換」で、XSLTプロセッサがスタイルシートをどのように処理していくのか説明しました。下記のスタイルシート「prefectures1.xsl」からなぜ、「出力1」が得られるのか、不明な場合は、もういちど前述の記事を見直してみてください。

prefectures1.xsl(都道府県名を抜き出すスタイルシート)

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" encoding="Shift_JIS"/>


  <xsl:template match="/prefectures">
    <HTML>
    <BODY>
    <xsl:apply-templates select="prefecture"/>
    </BODY>
    </HTML>
  </xsl:template>


  <xsl:template match="prefecture">
    <xsl:value-of select="name"/><br/>
  </xsl:template>

</xsl:stylesheet>


出力1(スタイルシートを適用した結果)

<HTML>
<BODY>北海道<br>青森県<br>岩手県<br>宮城県<br>
秋田県<br>山形県<br>福島県<br>茨城県<br>栃木県<br>
群馬県<br>埼玉県<br>千葉県<br>東京都<br>神奈川県<br>
新潟県<br>富山県<br>石川県<br>福井県<br>山梨県<br>
長野県<br>岐阜県<br>静岡県<br>愛知県<br>三重県<br>
滋賀県<br>奈良県<br>和歌山県<br>京都府<br>大阪府<br>
兵庫県<br>岡山県<br>鳥取県<br>島根県<br>広島県<br>
山口県<br>徳島県<br>香川県<br>愛媛県<br>高知県<br>
福岡県<br>佐賀県<br>長崎県<br>大分県<br>熊本県<br>
宮崎県<br>鹿児島県<br>沖縄県<br>
</BODY>
</HTML>

 「出力1」と同じ出力は、<xsl:call-template>タグを使用した「prefectures2.xsl」によっても得ることができます。<xsl:call-template>を呼び出すときは、属性に“name”を使い、またテンプレートも“name”で定義されていることに留意してください(下のほうに<xsl:value-of select="name"/>という行がありますが、これは都道府県名を記すタグ/prefectures/prefecture/nameタグのことです。)

prefectures2.xsl(別のスタイルシート)

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" encoding="Shift_JIS"/>


  <xsl:template match="/prefectures">
    <xsl:call-template name="body"/>
  </xsl:template>

  <xsl:template name="body">
    <HTML>
    <BODY>
    <xsl:apply-templates select="prefecture"/>
    </BODY>
    </HTML>
  </xsl:template>


  <xsl:template match="prefecture">
    <xsl:value-of select="name"/><br/>
  </xsl:template>


</xsl:stylesheet>

 これらの例では<xsl:output>タグや<xsl:value-of>タグなどが出てきましたが、これらのタグの詳しい使い方はあとで述べることにします。また、属性“mode”の使用法についてはフローコントロール系の<xsl:if>タグのところで例を示します。ここではあくまでも、XSLTの処理のコアであるテンプレートの定義の仕方、および呼び出し方について簡単に理解してもらえばいいでしょう。

例として示したファイルは下記からダウンロードできます。


Index
サンプルで覚えるXSLTプログラミング
  1. XMLからHTMLへの変換
スタイルシートはどのように解釈されるか
  2. XPathの基礎知識
XML文書をツリー構造で見る
XPathの表記方法
  3. XSLTエレメントの概要
コラム XSLTプロセッサのインストール
4. テンプレート系XSLTエレメント
テンプレートの定義
該当するテンプレートの適用
指定されたテンプレートの呼び出し
  5. 変数系XSLTエレメント
変数の定義1
変数の定義2
  6. 出力系XSLTエレメント
該当する表現の値を代入
エレメントノードの生成
属性ノードの生成
テキストノードの生成
コメントノードの生成
PI(processing-instruction)の生成
出力方法の指定
  7. フローコントロール系XSLTエレメント
ループ処理
条件分岐
IF文
  8. その他のXSLTエレメント
他のXSLファイルの読み込み
数の割り当て
  9.XSLT関数の概要
関数の主な分類
  10. 文字列系関数
文字列の連結
文字列の調査
数字のフォーマッティング
空白の除去
……
  11. 数値計算系関数
切り上げ
表現の数を数える
切り下げ
数値型への変換
四捨五入
加算
  12. ノードに関する関数
  13. bool代数系関数
  14. その他の関数
  15. JavaによるXSLTの拡張
Built-inクラスの呼び出し
カスタムメイドの関数を作る


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

注目のテーマ

HTML5+UX 記事ランキング

本日月間