XMLをIEで表示(基礎編) xsl:call-template

2006年07月16日(日)更新


xsl:call-templateでtemplateを呼び出しましょう

たけち: 今回は templateを呼び出すxsl:call-templateの使い方をサンプルで勉強しようね。

さらら: xsl:call-templateって名前からなんとなく想像ができそうね。

たけち: うん。文字通り、xsl:call-templateは、xsl:templateで指定したテンプレートを呼び出して、xsl:call-templateの個所にそのテンプレートが書かれていたのと同じ結果を導き出すんだ。

さらら: うんうん。まるで「関数」みたいなのね。

たけち: そうだね、そんな感じなんだね。じゃぁ、まずxsl:call-templateの使い方を図で説明しておくね。

xsl:call-templateの説明図

さらら: そんなに難しくなさそうね。nameが一致したテンプレートが使われるのね。

たけち: そうそう。じゃぁ、今回はこのxsl:call-templateを使って、xsl:variableで変換したのと同じような表示をしてみよう。ここではどんな風にxsl:call-templateを使っているのかを次の図で説明するね。


xsl:call-templateのサンプルの説明

xsl:call-templateサンプルの説明図

たけち: テンプレートの内容はxsl:variableサンプルのものとほぼ同じだから分かると思うよ。それぞれのテンプレートでは次のことをやっているね。

name="link_url"のtemplate
<a href="歌の説明をしているリンク先URL">歌番号: @pno</a>というリンクを生成
name="image"のtemplate
<img src="イメージファイル名" />を生成

さらら: あっ、分かるわ。

たけち: よかった。。。。じゃあ、今回のサンプルのXMLデータとXSLTスタイルシートを次に載せるね。


xsl:call-templateのサンプルXMLテキストとXSLスタイルシート

サンプルXMLデータ【call-template.xml】

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="call-template.xsl"?>

<manyosyu>

<poem pno="0008">
  <mkana>熟田津尓 船乗世武登 月待者 潮毛可奈比沼 今者許藝乞菜</mkana>
  <poet>額田王(ぬかたのおおきみ)</poet>
  <yomi>熟田津(にきたつ)に、船(ふな)乗りせむと、月待てば、潮もかなひぬ、今は漕(こ)ぎ出(い)でな</yomi>
  <mean>熟田津(にきたつ)で、船を出そうと月を待っていると、いよいよ潮の流れも良くなってきた。さあ、いまこそ船出するのです。</mean>
</poem>

<poem pno="0020">
  <mkana>茜草指 武良前野逝 標野行 野守者不見哉 君之袖布流</mkana>
  <poet>額田王(ぬかたのおおきみ)</poet>
  <yomi>茜(あかね)さす、紫野行き標野(しめの)行き、野守(のもり)は見ずや、君が袖振る</yomi>
  <mean>(茜色の光に満ちている)紫野、天智天皇御領地の野で、あぁ、あなたはそんなに袖を振ってらして、野守が見るかもしれませんよ。</mean>
</poem>

<poem pno="0023">
  <mkana>打麻乎 麻續王 白水郎有哉 射等篭荷四間乃 珠藻苅麻須</mkana>
  <poet>作者不明</poet>
  <yomi>打ち麻(そ)を、麻続(をみの)の王(おほきみ)、海人(あま)なれや、伊良虞(いらご)の島の、玉藻(たまも)刈ります</yomi>
  <mean>麻続(をみの)の王(おほきみ)さまは海人(あま)なのでしょうか、(いいえ、そうではいらっしゃらないのに、)伊良虞の島の藻をとっていらっしゃる・・・・・ </mean>
</poem>

<poem pno="0024">
  <mkana>空蝉之 命乎惜美 浪尓所濕 伊良虞能嶋之 玉藻苅食</mkana>
  <poet>作者不明</poet>
  <yomi>うつせみの、命を惜しみ、波に濡れ、伊良虞(いらご)の島の、玉藻(たまも)刈(か)り食(は)む</yomi>
  <mean>命惜しさに、波に濡れながら、伊良虞(いらご)の島の藻をとって食べるのです・・・ </mean>
</poem>

<poem pno="0028">
  <mkana>春過而 夏来良之 白妙能 衣乾有 天之香来山</mkana>
  <poet>持統天皇(じとうてんのう)</poet>
  <yomi>春過ぎて 夏来たるらし 白妙(しろたえ)の 衣干したり 天(あめ)の香具山(かぐやま)</yomi>
  <mean>春が過ぎて、夏が来たらしい。白妙(しろたえ)の衣が香久山(かぐやま)の方に見える。</mean>
</poem>

<poem pno="0037">
  <mkana>雖見飽奴 吉野乃河之 常滑乃 絶事無久 復還見牟</mkana>
  <poet>柿本人麻呂(かきのもとのひとまろ)</poet>
  <yomi>見れど飽かぬ、吉野の川の、常滑(とこなめ)の、絶ゆることなく、またかへり見む</yomi>
  <mean>何度見ても飽きることの無い吉野の川の常滑(とこなめ)のように、絶えること無く何度も何度も見にきましょう。</mean>
</poem>

</manyosyu>

【call-template.xsl】

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="manyo_url">
http://www6.airnet.ne.jp/manyo/main/one/m
</xsl:variable>

<xsl:template match="/">
  <html>
  <head>
  <title>たのしいXML: XSLサンプル: xsl:call-template</title>
  <link rel="stylesheet" type="text/css" href="manyo.css" />
  </head>

  <body>
  <p align="center">万葉集第1巻抜粋: <strong>xsl:call-template</strong>でtemplateを呼び出す</p>

  <xsl:apply-templates />

  </body>
  </html>
</xsl:template>

<xsl:template match="manyosyu/poem">
<table border="0" width="500" align="center">
  <tr>
  <th>
  <xsl:call-template name="link_url" />
  </th>
  <th><xsl:value-of select="poet" /></th>
  </tr>
  <tr>
  <td>
  <xsl:value-of select="yomi" />
  </td>
  <td>
  <xsl:call-template name="image" />
  </td>
  </tr>
</table>
</xsl:template>

<xsl:template name="link_url">
  <xsl:element name="a">   <xsl:attribute name="href">
  <xsl:value-of select="concat($manyo_url, @pno, '.html')" />
  </xsl:attribute>
  <xsl:value-of select="concat('歌番号: ', @pno)" />
  </xsl:element>
</xsl:template>

<xsl:template name="image">
  <xsl:element name="img">
  <xsl:attribute name="src">
  <xsl:value-of select="concat('image/m', @pno, '.jpg')" />
  </xsl:attribute>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

たけち: じゃあ、このXMLテキストを"call-template.xml"というファイル、XSLスタイルシートを"call-template.xsl"というファイルにして、実際にどうなるか見てみようね。次のテキストをクリックしてみて。

万葉集第1巻抜粋のXMLファイル call-template.xml(上記説明のXML/XSL適用)

すべての歌を表示

さらら: ねぇ。。。xsl:call-templateの使い方は分かったけど、このサンプルだと別にxsl:call-templateを使わなくてもいいんじゃないの?

たけち: あっ、うぅ・・・それはそうなんだけど。

さらら: うふふ・・・ (^ ^* たけちったら本気にしちゃって・・・

たけち: さらら・・・・ (ーー; じゃぁ、次回はtemplateにパラメタを渡す方法を勉強しようね。

さらら: パラメタ??

たけち: それは次回のお楽しみ。

さらら: は〜い。(^ ^* 

→次回はxsl:with-paramです (^ ^;