XSLTスタイルシートプログラミング(テンプレート)

テンプレートルールは「パターン」と「テンプレート」で構成し、パターンには「XML文書のどの部分」を、テンプレートには「どのように変換するか」を定義するということは、前回の記事で解説しました。では、今回は「どのように変換するか」を記述するテンプレート部分について詳しく見ていきます。

まずは変換元のXML文書をHTMLとして出力するテンプレートルールのサンプルを記載します。

  <xsl:template match="/">
    <html>
    <head>
    <title><xsl:text>ゲーム所持リスト</xsl:text></title>
    </head>
    <h1><xsl:text>ゲーム所持リスト</xsl:text></h1>
    <table>
    <tr>
        <th><xsl:text>ゲームタイトル</xsl:text></th>
        <th><xsl:text>購入日</xsl:text></th>
        <th><xsl:text>購入価格</xsl:text></th>
    </tr>
    <xsl:for-each select="ゲーム所持リスト/ゲーム情報">
    <tr>
        <td><xsl:value-of select="ゲームタイトル" /></td>
        <td><xsl:value-of select="購入日" /></td>
        <td><xsl:value-of select="購入価格" /></td>
    </tr>
    </xsl:for-each>
    </table>
    </html>
  </xsl:template>

※変換元のXML文書やXSLTスタイルシートの全内容は「XSLTスタイルシートプログラミング(宣言)」を参照してください。

<xsl:template>要素のmatch属性が「/」なので、XML文書全体に対して適用されるテンプレートになります。各所にHTMLタグが記述されているのがわかると思います。それらのタグは変換後のHTML文書に出力されます。

変換元のXML文書からではなく、XSLTスタイルシート上で新しいテキスト(テキストノード)を生成したい場合は、<xsl:text>要素を使用します。サンプルではHTML文書のタイトルやテーブル(表)の見出しなどの出力で使用しています。

<xsl:text>要素の書式
<xsl:text
【disable-output-escaping=”(yes | no)”】 />

※【 】で囲った属性は省略可能。

disable-output-escaping属性では、内部のテキストに「&lt;」や「&gt;」のようにエスケープ文字が含まれているときに、それを解釈させたい場合に「yes」を指定します。省略した場合はデフォルトの「no」が指定されます。また、<xsl:text>要素自体を省略することも可能です。つまり、例えば以下の記述はどちらも同じ内容が出力されます。

<th><xsl:text>ゲームタイトル</xsl:text></th>
<th>ゲームタイトル</th>

<xsl:text>要素は省略される場合が多いので、当サイトでも以降は省略して記述します。

テーブルの見出しを出力したら、続いて、テーブルの中身を変換元のXML文書から取り出して出力していきます。テーブルには1行に1つのゲーム情報を出力するため、<ゲーム情報>要素の数だけ、繰り返しXML文書から取り出すことになります。繰り返し処理は<xsl:for-each>要素を使用します。

<xsl:for-each>要素の書式
<xsl:for-each
select=”ノードへの位置を指定(XPath式)”>

  ループ1回で処理する内容

</xsl:for-each>

<xsl:for-each>要素は、select属性で指定した要素の内容を繰り返し出力します。

select属性ではXPathという決められた規則によってノード(要素や属性)を指定します。今回のサンプルで指定した「ゲーム所持リスト/ゲーム情報」は、<ゲーム所持リスト>要素配下の<ゲーム情報>要素を指定しています。

つまり、<xsl:for-each>要素により、<ゲーム情報>要素の数だけ、上から順番に繰り返し処理されることになります。その結果、サンプルのように記述することで、<xsl:for-each>要素1回のループにつき、ひとかたまりの<ゲーム情報>要素を1行(<tr>タグ)として出力されます。

XML文書から要素の内容(テキスト)を取り出すには<xsl:value-of>要素を使用します。

<xsl:value-of>要素の書式
<xsl:value-of
select=”ノードへの位置を指定(XPath式)”
【disable-output-escaping=”(yes | no)”】 />

※【 】で囲った属性は省略可能。

<xsl:value-of>要素はselect属性で指定した要素の内容を出力します。XSLTで最もよく使用されるのがこの<xsl:value-of>要素と言えるでしょう。

ここでは、<ゲームタイトル>、<購入日>、<購入価格>それぞれの要素の内容を出力しています。
なお、<xsl:for-each>要素は、カレントノードを移動させます。それにより、<xsl:value-of>要素のselect属性で指定する「ノードへの位置を指定」する方法が、<ゲーム情報>要素を基点とした方法に変わってきます。(詳細は「XPathとは」で解説します。)

ここまでの記述に間違えがなければ、XML文書を開くと関連付けられた上記のXSLTスタイルシートにより、変換されたHTML文書がWebブラウザ上に表示されます。

XSLTサンプル

XML文書、XSLTスタイルシート、HTML出力の3つが一度に出てきて混乱するかもしれません。一度にすべてを理解しようとはせず、まずは大まかな流れと何をやろうとしているかがイメージできれば良いでしょう。