テンプレートルールは「パターン」と「テンプレート」で構成し、パターンには「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属性では、内部のテキストに「<」や「>」のようにエスケープ文字が含まれているときに、それを解釈させたい場合に「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ブラウザ上に表示されます。
XML文書、XSLTスタイルシート、HTML出力の3つが一度に出てきて混乱するかもしれません。一度にすべてを理解しようとはせず、まずは大まかな流れと何をやろうとしているかがイメージできれば良いでしょう。