XPathとXSLTの関数 【ノード集合関数】 generate-id

2003年12月07日(日)更新


【ノード集合関数】 generate-id

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

さらら: はい。 (^ ^*

たけち: generate-idは、idを生成するのに使うんだ。

さらら: idを生成?

たけち: うん。実際には、idとして使える文字列を生成するんだけどね。

さらら: ふぅ〜ん。その文字列を利用してid属性なんかを作れるのね。

たけち: そうだね。まず、generate-id関数は、どう書くのかをつぎに載せておくね。

  • 書式: 文字列 generate-id(ノード集合)

さらら: 「ノード集合」をどうするの?

たけち: 引数として指定された「ノード集合」の中から順番にidとして使えるように、ノードを一意に識別できる文字列がリターン値として返るんだ。引数無しでgenerate-id関数を呼ぶと、コンテキストノードが使われるんだよ。

さらら: そうなんだ。。。やっぱり、サンプルで教えて。


generate-id関数の使用例

たけち: そうだね。ここでは、ページ内に表示する歌の解説のトップへのリンクを生成するのに使ってみようね。

さらら: はい。 (^ ^*

たけち: 次の【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データと同じね。

たけち: これを、これまでと同じように表示するのに加えて、先頭に「歌番号」をリストして、その歌番号をクリックするとその説明にジャンプするようにしてみよう。

さらら: え〜っと。。。

たけち: じゃあ、次の図を見て。

generate-id関数の使用例

さらら: あっ、こんな風にリンクをするのね。元のXMLデータだと、どれもpoem要素だし、pno属性だものね。それらを区別するために、ノードを一意に識別するための文字列を生成するのね。

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

さらら: はい。 (^ ^*

たけち: 次の【manyosyu.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 xmlns="http://www.w3.org/1999/xhtml">
   <head>
   <title>generate-id関数使用例: 歌番号から歌の解説にリンクします</title>
   <link rel="stylesheet" type="text/css" href="manyo.css" />
   </head>
   <body>
   <p>■generate-id関数使用例: 歌番号から歌の解説にリンクします</p>
   <p align="center">□万葉集 巻一抜粋(歌番号リスト)□</p>
   <p align="center"><xsl:apply-templates mode="list" /></p>
   <hr />
   <p align="center">□万葉集 巻一抜粋□</p>
   <xsl:apply-templates />
   <hr />
      <p align="right">以上です。</p>
   </body>
   </html>
</xsl:template>

<!-- 万葉集 巻一抜粋(歌番号リスト) -->
<xsl:template match="poem" mode="list">
   <a href="#{generate-id()}"><xsl:value-of select="@pno" /></a>
</xsl:template>

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

<table border="0" width="560">
   <tr>
   【<a name="{generate-id()}"><xsl:value-of select="@pno" /></a>】 <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>


■generate-id()

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

たけち: mode="list"が指定されているテンプレートで、歌番号のリストと、それぞれの歌の解説へのリンクを生成しているよね。

さらら: あっ、そのリンク先を一意に決めるための名前を作り出すのにgenerate-id関数を使っているのね。

たけち:そうだね。で、リンク先の個所の名前の生成にもgenerate-id関数を使っているんだね。いずれも、コンテキストノードが同じだから、generate-id関数で同じ文字列が生成されているので、それをリンクする方とされるほうの名前の一致に利用しているんだね。

さらら: なるほど〜。

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

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

歌番号のリストから歌の解説にリンク

さらら: うんうん。なるほど〜。

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

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

→つづきます (^ ^;


(注) generate-idによって生成される文字列はXSLTプロセツサによって異なります。
Xalanで上記XMLデータとXSLTスタイルシート(ただし、encoding="UTF-8"とします)で試したところ、generate-idによる文字列生成は次のようになりました。

  • N10006、N10019、N1002C、N1003F、N10052