XMLをIEで表示(基礎編) xsl:variable

2003年10月19日(日)更新


xsl:variableで変数を使いましょう

たけち: 今回は xsl:variableの使い方をサンプルで勉強しようね。

さらら: xsl:variable?? どんなものなの?

たけち: うん。これはね、XMLテキストのある情報をあちこちで使いたいときなんかに、その内容をxsl:variableで指定した「変数」にとっておいて使うんだ。

さらら: へぇ〜。「変数」なんて使えるの。難しくないの?

たけち: 意外に簡単なんだよ。まずは、xsl:variableでの変数の定義と、その変数の参照の仕方を図で説明しておくね。

xsl:variableによる定義と参照の仕方

さらら: 二通りの方法があるのね。でも、これだけだと、どっちもよく分かんないわ。

たけち: そうだね。やっぱり具体的に書いてみないと分かりにくいかもね。それぞれのの使い方を具体的にサンプルを作ってやってみようね。

さらら: いつもと同じようにするのね。

たけち: そうだけど、今回は「変数」を使うようにするとXMLデータもこれまでよりずっと簡単になるんだ。


xsl:variableのサンプルの説明

たけち: xsl:variableサンプルで変数を使う個所の説明を図にしておくね。変数は次の二つを使います。

  • 変数 manyo_url : リンク先のアドレスを作る時の固定文字列
     "http://www6.airnet.ne.jp/manyo/main/one/m"
  • 変数 no_of_poem : XMLデータのpoemごとのpno属性の値

xsl:variableサンプルで変数を使う個所の説明

さらら: manyo_urlはリンク先のURLを作るときに使うのね。う〜ん、と。。。no_of_poemには、どうやってpoemごとのpno属性の値を入れるのかしら・・・

たけち: それぞれの変数の値はselect属性で定義すればいいんだよ。次に書いておくね。

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

no_of_poemの定義
<xsl:variable name="no_of_poem" select="@pno" />

さらら: あっ、こうやって書くのね。参照するときは、$manyo_urlとか、$no_of_poeっていう風に書けばいいのかしら・・

たけち: そうそう。じゃあ、今回のサンプルのXMLテキストとのXSLスタイルシートを次に載せるね。


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

サンプルXMLテキスト

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="variable.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>

たけち: 今回のXMLデータには、imageタグが無くなっているからね。

さらら: あっ、本当だわ。。。。。それに、url属性も無くなっているわ!! どうしてかしら・・・

たけち: それは、次のXSLスタイルシートを読んでみるとわかると思うよ。

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:variable</title>
  <link rel="stylesheet" type="text/css" href="manyo.css" />
  </head>

  <body>
  <p align="center">万葉集第1巻抜粋: <strong>xsl:variable</strong>で変数を使う</p>

  <xsl:apply-templates />

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

<xsl:template match="poem">

<xsl:variable name="no_of_poem" select="@pno" />

<table border="0" width="500" align="center">
  <tr>
  <th>
  <a>
  <xsl:attribute name="href">
  <xsl:value-of select="concat($manyo_url, $no_of_poem, '.html')" />
  </xsl:attribute>
  <xsl:value-of select="concat('歌番号: ', $no_of_poem)" />
  </a>
  </th>
  <th><xsl:value-of select="concat(poet, 'の歌')" /></th>
  </tr>
  <tr>
  <td colspan="2"><xsl:value-of select="concat('読み: ', yomi)" /></td>
  </tr>
  <tr>
  <td><xsl:value-of select="mean" /></td>
  <td>
  <img>
  <xsl:attribute name="src">
  <xsl:value-of select="concat('image/m', $no_of_poem, '.jpg')" />
  </xsl:attribute>
  </img>
  </td>
  </tr>
</table>

</xsl:template>

</xsl:stylesheet>

さらら: 頭のところで、変数manyo_urlが定義されているわね。それと、poem要素用のtemplate変数no_of_poemが定義されているわね。

たけち: そうだね。

さらら: でも、manyo_urlの定義とno_of_poemの定義は、書いてある場所が違うわね。これはどうして??

たけち: no_of_poemは、poemごとに違うよね。だから、<xsl:template match="manyosyu/poem">のところに書いておかないといけないんだよ。

さらら: あっ、そっかぁ〜 (^ ^*


manyo_urlとno_of_poemの参照個所

さらら: 変数manyo_url変数no_of_poemが参照されているところのconcatってなぁに?

たけち: このconcatは、",(カンマ)"で区切って指定した文字列をくっつけて一つにするものなんだ。詳しくは別の項(concat)で説明しているから、ここではあまり気にしないで。

さらら: はい。つまりは、
  <xsl:value-of select="concat($manyo_url, $no_of_poem, '.html')" />
で、
http://www6.airnet.ne.jp/manyo/main/one/m0008.html
というような文字列が作られるのね。

たけち: そうだね。それから、
  <xsl:value-of select="concat('image/m', $no_of_poem, '.jpg')" />
で、
image/m0008.jpg
というような文字列が作られ、img要素のsrc属性の値として使われるんだね。。

さらら: なるほど。。。それで、もとのXMLデータにimg要素が必要なくなっているのね。

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

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

variable.xmlの表示結果

さらら: なるほどね〜。同じような表示をするときでも、XSLTスタイルシートの書き方っていろいろあるのね・・・・

たけち: そうだね。。今回のサンプルでは、XMLデータから、imageタグなんかを無くしたよね。このようにimageタグは表示のために使う情報だからほんとうはXMLデータには無いほうがいいんだよね。

さらら: そうだわね。XMLデータは少しでも短いほうが私には読みやすいわ!!

たけち: そうだね。じゃぁ今回はここまで。

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

→次回はxsl:call-templateです。 (^ ^;