12.2 Keys を参照。ここで挙げられている例は簡潔なXPath式で簡単に代替できるような代物で、key関数の本領とはかけ離れたものだ。
<xsl:key name="func" match="prototype" use="@name"/>
と宣言して、
key('func',.)
と使用しているけれども、このkey関数の戻り値は、
/descendant::prototype[string(@name) = string(self::node())]
と等価だし、また、
<xsl:key name="bib" match="entry" use="@name"/>
と宣言して、
<xsl:variable name="name" select="."/> <xsl:for-each select="document('bib.xml')"> <xsl:apply-templates select="key('bib',$name)"/> </xsl:for-each>
と使用しているけれども、これは次の一つのapply-templates要素と等価だ。variableとfor-eachを使う理由も見えない酷い例だと思う。
<xsl:apply-templates select=" document('bib.xml')/descendant::entry [string(@name) = string(current())] "/>
このような例を見てkey関数に食指を動かされる人はあまりいないと思う。「use属性」と「key関数の第二引数」にstring関数を適用してみて適用前と等価ならば、全て一行のXPathで代替可能だからだ。James Clark氏はひょっとしてW3Cが嫌いなのかもしれないが、もう少し真面目に書いて欲しい気がする。
つまるところ、私は一年前にこの例を見てkey関数を覚えるのは脳内メモリの無駄だと判断してしまい、今とても残念な思いをしているということ。<xsl:key>を使おう(1)とかの影響もあったかもしれない。
<xsl:key>とkey関数を知らなくても、これがわかっていないと組めないようなXSLTプログラムはありません(^^;)
(省略)
このあたり、使う意味があるのかないのか微妙なところですが、私自身は積極的に使った方がいいかな、と考えています
プログラムかどうかはともかくとして、key関数を知らなければ組む
のは非常に難しい場合もある筈。ちょっと考えただけでは不可能かもしれないと思える程。ただ、ここに挙げられている例について言えば、後でソースを見るときに解りやすいから私ならkey関数ではなく一行のXPathを使う。