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

7.フローコントロール系XSLTエレメント

 フローコントロールタグをうまく使用すると、簡潔にスタイルシートをまとめあげることが可能です。繰り返しの処理は<xsl:for-each>などでできますし、条件分岐には<xsl:if>などが使用できます。


 ループ処理
 <xsl:for-each>

属性名 属性値 機能
select XPath表現 作業を繰り返すノードの表現を記入します。

 下記のスタイルシート「prefectures6.xsl」では、ループ処理の例として<xsl:apply-templates>を使用せずに、<xsl:for-each>と<xsl:call-template>を組み合わせて、出力1と同様の結果を出力します。

prefectures6.xsl(結果は出力1と同等)

<?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:for-each select="prefecture">
      <xsl:call-template name="prefecture"/>
    </xsl:for-each>
    </BODY>
    </HTML>
  </xsl:template>


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

</xsl:stylesheet>


 条件分岐
  <xsl:choose>、<xsl:when>と<xsl:otherwise>


C言語でいうswitch、case, default処理を行います。
<xsl:choose>と<xsl:otherwise>には属性はありません。

属性名 属性値 機能
test 表現 ブール値で返される表現を記入します。

 下記のスタイルシート「prefectures7.xsl」では、<xsl:choose>ブロック内で<prefecture>エレメントの属性ノード“id”が1ならば“北海道”、それ以外で8以下ならば(すなわち2以上8未満ならば)“東北”というように地方名を書き込みます。デフォルトは<xsl:otherwise>で指定されているように“九州”です。このスタイルシートによる出力は「出力4」のようになります。

prefectures7.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:choose>
    <xsl:when test="@id=1">北海道</xsl:when>
    <xsl:when test="@id&lt;8">東北</xsl:when>
    <xsl:when test="@id&lt;15">関東</xsl:when>
    <xsl:when test="@id&lt;19">北陸</xsl:when>
    <xsl:when test="@id&lt;24">中部</xsl:when>
    <xsl:when test="@id&lt;31">近畿</xsl:when>
    <xsl:when test="@id&lt;36">中国</xsl:when>
    <xsl:when test="@id&lt;40">四国</xsl:when>
    <xsl:otherwise>九州</xsl:otherwise>
  </xsl:choose>
  <xsl:text> 都道府県名:</xsl:text>
  <xsl:value-of select="name"/>
  <br/>
  </xsl:template>

</xsl:stylesheet>

出力4

<HTML>
<BODY>
地方名: 北海道 都道府県名:北海道<br>
地方名: 東北 都道府県名:青森県<br>
地方名: 東北 都道府県名:岩手県<br>
地方名: 東北 都道府県名:宮城県<br>
地方名: 東北 都道府県名:秋田県<br>
地方名: 東北 都道府県名:山形県<br>
地方名: 東北 都道府県名:福島県<br>
地方名: 関東 都道府県名:茨城県<br>
地方名: 関東 都道府県名:栃木県<br>
地方名: 関東 都道府県名:群馬県<br>
地方名: 関東 都道府県名:埼玉県<br>
地方名: 関東 都道府県名:千葉県<br>
地方名: 関東 都道府県名:東京都<br>
地方名: 関東 都道府県名:神奈川県<br>

……以下略……

 


 IF文
 <xsl:if>

“test”の値がTrueのときに、処理を実行します

属性名 属性値 機能
test 表現 ブール値で返される表現を記入します。

 スタイルシート「prefectures8.xsl」ではkm四方あたりの人口密度が1000人を超える都道府県を<xsl:if test="population div area&gt;1000">で選び出してています。 人口密度の高い都道府県が「出力5」のように得られます。

prefecture8.xsl(人口密度が1000人を超える都道府県を選ぶ)

<?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>
    人口密度が高い都道府県<br/>
    <xsl:apply-templates select="prefecture"/>
    </BODY>
    </HTML>
  </xsl:template>


  <xsl:template match="prefecture">

    <xsl:if test="population div area&gt;1000">
      <xsl:value-of select="name"/>
      <br/>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

出力5

<HTML>
<BODY>
人口密度が高い都道府県<br>
埼玉県<br>千葉県<br>東京都<br>神奈川県<br>
愛知県<br>大阪府<br>
</BODY>
</HTML>

 このように、フロー制御を組み込むことによって高度な処理をすることが分かったと思います。ここでもconcat関数が出てきましたが、通常、属性“test”では関数を多用します。これらおもな関数とその使用法については、次回に説明します。

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



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 記事ランキング

本日月間