XML HOME > 基本的なXSLTファイルの作成

基本的なXSLTファイルの作成(最終更新日 2002/06/15)

最小のXSLTファイル
XML と同様、XSLT ファイルも宣言が必要である。
XML の宣言行のあとに、以下の記述をしておくと、このファイルは XSLT ファイルであると認識される。これをスタイルシート宣言という。
なお、スタイルシート宣言は、特に問題のない限り、常にこの形式で記述される。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
このタグを宣言しておくことで、XSL 名前空間を定義している。

例えば、XML ファイル内で、name タグが人の氏名と、商品名の双方を示す場合もある。
このような場合、同一タグを区別するため、唯一無二の接頭辞をつけておくことが必要になる。

そこで、全世界で唯一無二である、URL を接頭辞と結び付けておくことで、タグの区別を行う。上記の表記では、<xsl:〜>のタグは、 http://www.w3.org/1999/XSL/Transform に記述されている表記法に従うことになる。

前述したように、XSLT は XML 文書を他書式に変換するための規約である。そこで、以下の出力指定により、出力する文書の書式を宣言する。
<xsl:output method = "html" version = "4.0" encoding = "Shift_Jis" />
出力指定は以下の書式で記述される。
<xsl:output method="出力形式" version = "出力バージョン "
                                             encoding = "記述文字コード名">
出力形式は、"html", "xml", "text" などの指定が可能であり、デフォルトは "xml" になっている。
このとき、文字コードは、XML 宣言の文字コードと同じである必要がある。

XML ファイルから要素を抽出するために、以下の xsl:template タグを記述する。
<xsl:template match="/">
上記の表現は、「ルート要素は以下のテンプレート(書式)に従う」ことを明示している。これをテンプレート規則という。
<xsl:template match="要素名">
要素名が、"/" の場合、特にルート要素に適用する(詳細に関しては、次項参照)。

XSLT は、XML 宣言、 スタイルシート宣言、出力指定、テンプレート規則の4種類で構成される。
(例) (最小のXSLTファイルの例)
  <?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" version = "4.0" encoding = "Shift_Jis"/>
   <xsl:template match="/">
   </xsl:template>
  </xsl:stylesheet>

XSLT ファイルを、XML ファイル適用する場合、XMLファイル側のXML宣言後、以下の文を追加する。
<?xsl:stylesheet type="text/xsl" href="適用する XSL ファイル名">

実際に、XML ファイルに 上記のXSLT ファイルを適用したサンプルはこちら
また、そのとき適用した XSLT ファイルはこちら
テンプレート規則の記述方法
サンプルの XSLT ファイルを適用しても、XML ファイルは、何も表示されなかったと思う。
ただし、ソースの表示で確認すると、XML ファイルは配信されている。

表示されなかったのは、テンプレート規則を記述していないためである。

テンプレート規則とは、文字通り出力データのテンプレートである。
ルート要素と呼ばれるタグ(前項参照)を基点とし、その配下に樹状に節点(ノード:テンプレート規則)を定義していく。(下図参照)

ここで、先ほどのXSLTファイルに対して、ルート要素のテンプレート規則を以下のように定義する。
(例) (テンプレート規則の例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" version = "4.0" encoding = "Shift_Jis" />
  <xsl:template match="/">
   <html><head><title>ローマ年表</title></head>
    <h1>ローマ年表</h1>
   </html>
  </xsl:template></xsl:stylesheet>
上記のテンプレートでは、ルート要素にタイトル表示用の定義を行っている。
この XSLT ファイルを先ほどの XML ファイルに適用したサンプルを紹介する。

次に年表を表形式に出力するため、テンプレートを追加・修正する。
(例) (テンプレート規則の例2)
  <?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" version = "4.0" encoding = "Shift_Jis" />

  <xsl:template match="/">
   <html><head><title>ローマ年表</title></head>
    <h1>ローマ年表</h1>
    <table border = "1">
    <tr>
     <td>年</td>
     <td>事柄</td>
    </tr>
    <xsl:apply-templates select="main"/>
    </table>
   </html>
  </xsl:template>

  <xsl:template match="main">
   <xsl:for-each select="col">
   <tr>
    <td><xsl:value-of select="year"/></td>
    <td><xsl:value-of select="event"/></td>
   </tr>
   </xsl:for-each>
  </xsl:template>

  </xsl:stylesheet>
まず、ルート要素内に存在している xsl:apply-templates タグの説明をする。
<xsl:apply-templates select="対応するノード名">
xsl:apply-templates タグで指定されているノード名は、それ以降で必ず xsl:template タグとして宣言されている必要がある。
これにより、xsl:apply-templates タグが表記されている箇所に、xsl:template タグで定義されたテンプレート宣言が適用される。

ただし、記述するノード名は XML ファイル内のタグである必要がある。上記例では、<xsl:template match="main"> のテンプレートは <main> タグ配下にのみ適用される。

上記例XML ファイルの <main> タグ配下には <year> タグと <event> タグが存在しているが、それらのデータを抽出するために xsl:value-of タグが使用されている。
<xsl:value-of select="抽出対象のタグ名">
これにより、特定タグの内容を抽出することができる。

main タグ配下には col タグがいくつも存在していて、col タグ配下に上記の year タグや event タグが存在しているが、複数のタグに対して同一の処理を行う際に使用されるのが xsl:for-each タグである。
<xsl:for-each select="繰り返し処理対象のタグ名">

以上より、上記の例では、表の標題をルート要素のテンプレート宣言により定義したのち、main 要素のテンプレート宣言内で、その配下の col タグの個数分 year タグのデータ、event タグのデータを抽出して、表行要素を作成していることになる。

上記サンプルの XSLT ファイルはこちらから。適用する XML ファイルがこちらから。