XPathとXSLTの関数 【ノード集合関数】 last

2003年12月14日(日)更新


【ノード集合関数】 last

たけち: 今回は、ノード集合関数のひとつ、last関数について学ぼうね。

さらら: はい。 (^ ^*

たけち: last関数は、カレントノードリストのサイズ、つまり何個のノードがあるかを、数値で返してくれるんだ。。

さらら: ふぅ〜ん。

たけち: last関数は、テンプレートでノードセット中の(文書順で)最後のノードについて特別な処理をしたいときなどに使うんだ。

さらら: あっ、そっか。

たけち: じゃ、まず、last関数は、どう書くのかをつぎに載せておくね。

  • 書式: 数値 last()

さらら: カレントノードリストのサイズを求めるから、引数は無いのね。

たけち: そうなんだね。じゃ、いつものようにサンプルをみてみよう。ここでは、XMLデータ中の歌のリストを生成するのに使ってみようね。

さらら: はい。 (^ ^*

たけち: 次の【manyosyu.xml】を見て。

【manyosyu.xml】

<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="manyosyu.xsl"?>
<manyosyu vol="01">

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

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

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

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

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

</manyosyu>

さらら: これまでにサンプルとして使ったXMLデータと同じね。

たけち: これを、これまでと同じように表示するのに加えて、先頭に「歌番号」を","(カンマ)で区切って表示しよう。それから、紹介する歌の数として、poem要素ノードの数を利用してみよう。

さらら: はい。つまり、カレントノードリストの最後のノードかどうかで、","(カンマ)を表示するかしないかを決めるのね。。。それと、歌の数を表示するのにもlast関数を使うわけね。

たけち: そうだね。じゃあ、これを実現するXSLTスタイルシートの例をみてみよう。

さらら: はい。 (^ ^*

たけち: 次の【manyosyu.xsl】を見て。

XSLTスタイルシート: last関数の使用例

<?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 xmlns="http://www.w3.org/1999/xhtml">
   <head>
   <title>last関数使用例: 歌番号のリストと歌の数を表示します</title>
   <link rel="stylesheet" type="text/css" href="manyo.css" />
   </head>
   <body>
   <p>■last関数使用例: 歌番号のリストと歌の数を表示します</p>
   <p align="center">□万葉集 巻一抜粋(歌番号リスト)□</p>
   <p align="center"><font color="navy"><xsl:apply-templates mode="list" /></font></p>
   <hr />
   <p align="center">□万葉集 巻一抜粋□</p>
   <xsl:apply-templates />
   <hr />
      <p align="right">以上です。</p>
   </body>
   </html>
</xsl:template>

<!-- 万葉集 巻一抜粋(歌番号リスト) -->
<xsl:template match="poem" mode="list">
   <xsl:choose>
   <xsl:when test="position()=last()">
   <xsl:value-of select="@pno" />の<xsl:value-of select="last()" />首を紹介します。
   </xsl:when>

   <xsl:otherwise>
   <xsl:value-of select="@pno" />,
   </xsl:otherwise>

   </xsl:choose>
</xsl:template>

<!-- 万葉集 巻一抜粋 -->
<xsl:template match="poem">

<table border="0" width="560">
   <tr>
   【<xsl:value-of select="@pno" />】 <xsl:value-of select="yomi" />
   </tr>
   <tr>
   <td><xsl:value-of select="mean" /></td>
   <td><img><xsl:attribute name="src"><xsl:value-of select="image" /></xsl:attribute></img>
   </td>
   </tr>
</table>

<p />
</xsl:template>

</xsl:stylesheet>


■last()

さらら: 二ヶ所でlast関数を使っているのね。

たけち: mode="list"が指定されているテンプレートで、歌番号のリストと、歌の数、ここでは「5首を紹介します。」という文字列を生成しているよね。

さらら: あっ、最後のpoem要素ノードかどうかを判断するのと、poem要素ノードの数を知るのにlast関数を使っているのね。それにしても、xsl:chooseって久しぶりに見たわ。

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

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

歌番号のリストを生成

さらら: うんうん。last関数は分かりやすかったわ。

たけち: じゃあ、今回はこれでおしまい。

さらら: はい。ありがと。 (*^ ^*)

→つづきます (^ ^;