Jintrick.netagenda2003年10月アーカイブ → 2003年10月04日

XSLT key関数について

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プログラムはありません(^^;)

(省略)

このあたり、使う意味があるのかないのか微妙なところですが、私自身は積極的に使った方がいいかな、と考えています

<xsl:key>を使おう(1)より

プログラムかどうかはともかくとして、key関数を知らなければ組むのは非常に難しい場合もある筈。ちょっと考えただけでは不可能かもしれないと思える程。ただ、ここに挙げられている例について言えば、後でソースを見るときに解りやすいから私ならkey関数ではなく一行のXPathを使う。


webmaster@jintrick.net
公開: 2003年10月04日
カテゴリ: XSLT