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

6.出力系XSLTエレメント

 出力系エレメントはXML文書を出力するときに使用するタグ群です。出力系のタグは非常に重要です。特に<xsl:value-of>や<xsl:attribute>は頻繁に使用されることが多いと思いますので、ぜひマスターしてください。

 <xsl:output>はWML文書(WAPで使われるXML標準)など、ヘッダー部分を記述する際に使用します。<xsl:outpu>を使用したWAPの例(phone.com version 3.2ブラウザ対応)も紹介しますので、興味のある方の参考になれば幸いです。


 該当する表現の値を代入
 <xsl:value-of>

属性名 属性値 機能
select XPath表現 ここで指定された表現の内容が出力されます。必須です。
disable-output-escaping yes/no 特殊文字&などを&amp;と表現するのが(no)がデフォルトになっています。これを(yes)とすることで文字はエスケープなしにそのまま表記されます。

例:<xsl:value-of select="name"/>


 エレメントノードの生成
 <xsl:element>

属性名 属性値 機能
name 文字列 エレメントノードの名前で必須です。

例:<xsl:element name="HTML">


 属性ノードの生成
 <xsl:attribute>

属性名 属性値 機能
name 文字列 属性ノードの名前で必須です。

例:<xsl:attribute name="VALUE">


 テキストノードの生成
 <xsl:text>

属性名 属性値 機能
disable-output-escaping "yes"/"no" 特殊文字&などを&amp;と表現する(no)がデフォルトになっています。これを(yes)とすることで文字はエスケープなしにそのまま表記されます。

例:
<xsl:comment>
    <xsl:text>コメントです</xsl:text>
</xsl:comment>


 コメントノードの生成
 <xsl:comment>

属性はありません。


 PI(processing-instruction)の生成
 <xsl:processing-instruction>

属性名 属性値 機能
name 文字列 PIノードの名前で必須です。

PIとは<?xml version="1.0"?>のように<?と?>で挟まれた特殊なタグのことです。


 出力方法の指定
 <xsl:output>

属性名 属性値 機能
method "html"/"text"/"xml"/文字列 出力のフォーマットを記入します。
encoding 文字列 出力のエンーディングを指定します。
omit-xml-declaration "yes"/"no" <?xmlで始まるタグを省略するかどうかを指定します。
doctype-public 文字列 DOCTYPE宣言のpublic内容を指定します。
doctype-system 文字列 DOCTYPE宣言のsystem内容を指定します。
meida-type 文字列 MIMEタイプを指定します。

例: <xsl:output method="html" encoding="Shift_JIS"/>


 下記のスタイルシート「prefectures4.xsl」では、ここで紹介したタグ(<xsl:processing-instruction>および<xsl:output>を除いたもの)をすべて使用しています。これによって「出力3」が得られます。

prefectures4.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:comment>
      <xsl:text>コメントです</xsl:text>
    </xsl:comment>
    <xsl:element name="HTML">
      <xsl:element name="BODY">
        <xsl:element name="FORM">
          <xsl:element name="SELECT">
            <xsl:apply-templates select="prefecture"/>
          </xsl:element>
        </xsl:element>
      </xsl:element>
    </xsl:element>
  </xsl:template>


  <xsl:template match="prefecture">
    <xsl:element name="OPTION">
      <xsl:attribute name="VALUE">
        <xsl:value-of select="name"/>
      </xsl:attribute>
      <xsl:value-of select="capital"/>
    </xsl:element>
  </xsl:template>


</xsl:stylesheet>

出力3(都道府県の一覧)

<!--コメントです--><HTML>
  <BODY>
    <FORM>
      <SELECT>
        <OPTION VALUE="北海道">札幌</OPTION>
        <OPTION VALUE="青森県">青森</OPTION>

……中略……

        <OPTION VALUE="鹿児島県">鹿児島</OPTION>
        <OPTION VALUE="沖縄県">那覇</OPTION>
      </SELECT>
    </FORM>
  </BODY>
</HTML>

 普通はエレメントノードを動的生成することはあまりないため、<xsl:element>で取り扱わず、“<OPTION>”のようにエレメントを直接スタイルシート内に記述していきます。<xsl:element>を使ってエレメントを動的生成する例として、下記のような例があります。

<xsl:element name="concat('H', $size)">
ここはタグ&lt;H<xsl:value-of select="$size">&gt;で指定されたサイズで表示されます。
</xsl:element>

 ここでは、<H1>から<H6>のようなタグを、“$size”と“1”から“6”までに分割して、動的に結合することでタグを生成しています。concat関数は、2つ以上の任意の数の文字列を連結する関数です。

スタイルシートでWMLを生成してみる

 さてこれまではHTML(XHTML)への変換のみを扱ってきました。読者の中にはXSLTが単なるHTMLへの変換言語だと思われている方がいるかもしれません。言い訳がましいようですが、HTMLへの変換を主にしているのはHTMLに変換することでXSLTの機能を理解していただくのが一番早い方法だと考えているからです。

 そこで、ここではHTML以外への変換として、WMLへの変換例を紹介します。その前に、WMLの一般的なフォーマットを簡単に説明しておきましょう。

template.wml(WMLのフォーマット例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<!-- Main menu for WML examples -->
<wml>
  <head>
    <meta http-equiv="Content-type"
content="text/vnd.wap.wml; charset=Shift_JIS"/>
  </head>
  <card title="WML Examples">
    <p>
      日本語表示のテストです。
    </p>
  </card>
</wml>

 注意点は、2行目、3行目にある<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN""http://www.wapforum.org/DTD/wml_1.1.xml">というWMLタグを生成するのに、<xsl:output>タグを使用する点です。

 では、スタイルシートの例を紹介しましょう。下記の「efectures5.xsl」は都道府県名のリストをWMLフォーマットで出力するするものです。

prefectures5.xsl(都道府県名利ストをWMLで出力)

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output doctype-system="http://www.wapforum.org/DTD/wml_1.1.xml"
doctype-public="-//WAPFORUM//DTD WML 1.1//EN" media-type="text/vnd.wap.wml" />
  <xsl:template match="/">
    <wml>
      <head>
        <meta http-equiv="Content-type"
content="text/vnd.wap.wml; charset=Shift_JIS" />
      </head>
      <card title="WML Examples">
        <xsl:for-each select="//prefecture">
          <p>
            <xsl:value-of select="name" />
          </p>
       </xsl:for-each>
      </card>
    </wml>
  </xsl:template>
</xsl:stylesheet>

 上記のスタイルシートでは、フローコントロール系の<xsl:for-each>タグが使用されていますが、これについては次回説明します。ここでは“prefecture”というタグがあるたびに、<xsl:for-each>に挟まれた処理を実行するものだと考えてください。

 WMLに興味のある方は、phone.comからWAP端末シミュレーターをダウンロードして使用してみると、実際に上記のWMLを表示させることができます。

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


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

本日月間