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

2003年11月30日(日)更新


【ノード集合関数】 current

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

さらら: はい。 (^ ^*

たけち: currentは、カレントノードを取得するのに使うんだ。

さらら: カレントノードって、テンプレート処理の対象になっているノードなのよね。それをわざわざ指定する必要ってあるのかしら。。。

たけち: うん。でも、select属性の中に書いた「式」でこれが必要になることがあるんだよ。

さらら: へぇ、そうなんだ。

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

  • 書式: ノード current()

さらら: ずい分、あっさりしているわね。

たけち: 引数無しでcurrent関数を呼ぶと、リターン値としてカレントノードが返されるんだね。

さらら: えぇ。。。。


current関数の使用例

さらら: やっぱり、サンプルで教えて。

たけち: そうだね。じゃあ、簡単なサンプルを見てみよう。

さらら: はい。 (^ ^*

たけち: 次の【poem.xml】を見て。これまでと少し違うからね。

【poem.xml】

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

<poems>
<poem pno="0008" poet="003">
熟田津(にきたつ)に船(ふな)乗りせむと月待てば潮もかなひぬ今は漕(こ)ぎ出(い)でな
</poem>

<poem pno="0020" poet="003">
茜(あかね)さす 紫野行き標野(しめの)行き 野守(のもり)は見ずや 君が袖振る
</poem>

<poem pno="0028" poet="002">
春過ぎて 夏来たるらし 白妙(しろたえ)の 衣干したり 天(あめ)の香具山(かぐやま)
</poem>

<poem pno="0037" poet="001">
見れど飽かぬ 吉野の川の 常滑(とこなめ)の 絶ゆることなく またかへり見む
</poem>

<ppoet="003">
み吉野(よしの)の 玉(たま)松(まつ)が枝(え)は はしきかも 君が御言(みこと)を 持ちて通(かよ)はく
</poem>

<poem pno="0137" poet="001">
秋山に 落つる黄葉(もみちば) しましくは な散り乱ひそ 妹があたり見む
</poem>

</poems>

<poets>
   <poet id="001">柿本人麻呂(かきのもとのひとまろ)</poet>
   <poet id="002">持統天皇(じとうてんのう)</poet>
   <poet id="003">額田王(ぬかたのおおきみ)</poet>
</poets>

</manyosyu>

さらら: 歌が6首載っているわ。pno属性が歌番号なのね。poet="001"とかは何を示しているのかしら。

たけち: それは、poet要素のid="001"と数字がおなじものが歌人を示しているんだよ。

さらら: あっ、ということは、例えばpoet="001"のあるpno="0037"の歌は、柿本人麻呂(かきのもとのひとまろ)の作だということなのね。

たけち: そう。そうだね。じゃあ、このxmlデータを元にして、

  • 歌番号
  • 歌人名
を表示してみよう。

さらら: えぇ。

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

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

<?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>count関数の使用例: 歌人ごとの歌の数</title>
         <link rel="stylesheet" type="text/css" href="manyo.css" /></head>
      <body>

      <p><font color="navy">■<strong>current</strong> 関数の使用例: 歌人と歌</font></p>

      <table border="1" width="600">
         <tr><th>歌番号</th><th>歌人</th><th>歌</th></tr>
         <xsl:apply-templates select="//poem" />
      </table>

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

<xsl:template match="//poem">
   <tr>
   <td width="60"><xsl:value-of select="@pno" /></td>
   <td><xsl:value-of select="//poet[@id=current()/@poet]" /></td>
   <td><xsl:value-of select="." /></td>
   </tr>
</xsl:template>

</xsl:stylesheet>


■current()/@poet

さらら: 歌人の名前を表示するところで、current関数を使っているのね。
select="//poet[@id=current()/@poet]"
どういう意味かしら・・・

たけち: //poetは分かるよね。

さらら: え〜っと。poet要素だわね。。。

たけち:そうだね。で、[と]で囲まれている条件に合うpoet要素を指定しているんだ。その内容を詳しく見てみよう。つぎの図を見て。

current関数の使用例(1)

たけち: どう? @idを見ているときには文脈ノードが、カレントノードpoemからpoetに移動しちゃっているんだね。

さらら: あっ、そうなんだ。。。だから、カレントノードpoempoet属性を見ようとすると、current()/@poetとしなくちゃいけないのね。

たけち: そうなんだね。こういう場合には、current()関数が必要なんだね。

さらら: なるほど。それで、カレントノードpoempoet属性の値と、文脈ノードpoet要素の@idの値が一致するpoet要素の内容、つまり歌人名のテキストが取れるわけね。

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

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

歌番号・歌人・歌を表示

さらら: あっ、こんな風に表示されるのね。なるほど〜。

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

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

→次は、document関数です (^ ^;