XSLT基礎編: xsl:for-eachで繰り返し処理

2007年08月19日(日)更新


■xsl:for-each要素で繰り返し処理をする

たけち: 今回は、for-each要素について学ぶね。

さらら: for-each要素?

たけち: for-each要素は指定したノードについて処理を繰り返すことを定義するんだ。

さらら: ・・・・・(^ ^;

たけち: じっ、じゃあ、具体的に見てみようね。前回使ったXMLデータを使うね。

XMLデータ例: 万葉集第1巻・第2巻抜粋

<?xml version="1.0" encoding="Shift_JIS" ?>

<manyosyu>
<poem pno="8">
  <pno>8</pno>
  <poet>額田王(ぬかたのおおきみ)</poet>
  <yomi>熟田津(にきたつ)に船(ふな)乗りせむと月待てば潮もかなひぬ今は漕(こ)ぎ出(い)でな</yomi>
</poem>

<poem pno="20">
  <poet>額田王(ぬかたのおおきみ)</poet>
  <yomi>茜(あかね)さす 紫野行き標野(しめの)行き 野守(のもり)は見ずや 君が袖振る</yomi>
</poem>

<poem pno="28">
  <poet>持統天皇(じとうてんのう)</poet>
  <yomi>春過ぎて 夏来たるらし 白妙(しろたえ)の 衣干したり 天(あめ)の香具山(かぐやま)</yomi>
</poem>

<poem pno="37">
  <poet>柿本人麻呂(かきのもとのひとまろ)</poet>
  <yomi>見れど飽かぬ 吉野の川の 常滑(とこなめ)の 絶ゆることなく またかへり見む</yomi>
</poem>

<poem pno="113">
  <poet>額田王(ぬかたのおおきみ)</poet>
  <yomi>み吉野(よしの)の 玉(たま)松(まつ)が枝(え)は はしきかも 君が御言(みこと)を 持ちて通(かよ)はく</yomi>
</poem>

<poem pno="137">
  <poet>柿本人麻呂(かきのもとのひとまろ)</poet>
  <yomi>秋山に 落つる黄葉(もみちば) しましくは な散り乱ひそ 妹があたり見む</yomi>
</poem>

</manyosyu>


for-each要素の書き方

さらら: 歌人名と歌が並んでいるのね。

たけち: そうだね。このXMLデータを元にして、簡単な表を作ってみるね。
まず、for-each要素の書き方を簡単に説明しておくね。
(1) for-each要素は、xsl:template要素の子要素として書くんだ。そして、(2) 処理対象とするXMLデータのノードを、select属性で指定するんだ。図に簡単に載せておくね。

xsl:for-each要素の書き方


xsl:for-eachでpoem要素の変換処理する例

さらら: ふ〜ん。まだイメージが湧かないわ。

たけち: じゃあ、for-each要素を使ったXSLTスタイルシートの例を、先に見てみよう。つぎのスタイルシートを見て。

XSLTスタイルシート例: for-eachを使って万葉歌をテーブル表示

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

<xsl:template match="/">
   <html>
   <head>
   <title>たのしいXML: XSLTスタイルシート例(for-eachで歌のリストを表示)</title>
   <link rel="stylesheet" type="text/css" href="manyo.css" />
   </head>

   <body>
   <p align="center"><font color="navy">万葉集第1巻抜粋: for-eachで歌のリストを表示</font></p>

   <table border="1" width="600" align="center">
      <tr>
         <th width="40%">歌人</th>
         <th>歌</th>
      </tr>

   <xsl:apply-templates />

   </table>

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


<xsl:template match="manyosyu">

<xsl:for-each select="poem">
      <tr>
         <td><xsl:value-of select="poet" /></td>
         <td><xsl:value-of select="yomi" /></td>
      </tr>
</xsl:for-each>


</xsl:template>

</xsl:stylesheet>

さらら: あっ、for-eachのselect要素で指定したすべてのpoemについて
      <tr>
         <td><xsl:value-of select="poet" /></td>
         <td><xsl:value-of select="yomi" /></td>
      </tr>
の処理をするのね。

たけち: そうなんだね。この場合は、歌(poem)の歌人(poet)と読み(yomi)をHTMLのtableとして生成しているんだね。

さらら: なるほどね。

たけち: この様子を次の図に載せておくね。

for-each要素を使ったXLSTスタイルシートの概要

たけち: じゃあ、このXSLTスタイルシートを"for-each_1.xsl"というファイルにして、実際にどうなるか見てみようね。次のテキストをクリックしてみて。あっ、そうそう。いつもと同じように、XMLデータの2行目は
<?xml-stylesheet type="text/xsl" href="for-each_1.xsl"?>
として、"poem15_1.xml"というファイルを作成しているからね。

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

こんな風に表示されます・・・

さらら: なるほどねぇ。xsl:for-eachってこう使うのね・・・
あれ?でも、これって、これまでのように、
<xsl:template match="poem">
    <tr>
        <td><xsl:value-of select="poet" /></td>
        <td><xsl:value-of select="yomi" /></td>
    </tr>
</xsl:template>


って書いても同じなんじゃないの?

たけち: 実は、この場合は、そうなんだ。

さらら: えっ、じゃあ、どうしてxsl:for-eachの例を見せてくれたの?

たけち: うん。じゃあ。xsl:for-eachと一緒に使えるxsl:sortについて次に説明するね。それを使うと便利なことがあるんだよ。

さらら: あっ、そういうことなのね。。。。。はい!!

たけち: じゃ。今回はここまでね。

さらら: ありがと。

→次回は、xsl:sortです。。。。(^ ^;