XSLT 6章 追加の関数
- 6.1 複数のソースドキュメント
- 6.2 キー
- 6.3 数字のフォーマット
- 6.4 その他の追加関数
6.4 その他の追加関数
6.4.1 current 関数
node-set current()
current 関数は、カレントノードを唯一のメンバとして持つノード集合を返します。XPath の述語の外側では、カレントノードとコンテキストノードは同一ですが、述語の内部では通常、カレントノードとコンテキストノードは異なります。そのようなときにカレントノードに簡単にアクセスする手段を提供します。
たとえば、親要素が glossary であり、なおかつ name 属性の値がカレントノードの ref 属性の値と等しい、すべての item 要素を処理したいときは以下のように記述します。
<xsl:apply-templates select="//glossary/item[@name=current()/@ref]"/>
6.4.2 generate-id 関数
string generate-id(node-set?)
generate-id 関数は、引数に指定されたノード集合から、ドキュメント順で最初のノードに対し、ID 型属性値として使うことのできる文字列を返します。特定のノードには常に同じ文字列を生成し、異なるノードには常に異なる文字列を生成します。引数を省略した場合は、コンテキストノードを指定したと見なされ、また、引数に指定されたノード集合が空集合の場合には、空の文字列を返します。
<root> <prototype name="key" return-type="node-set"> <arg type="string"/> <arg type="object"/> </prototype> <prototype name="document" return-type="node-set"> <arg type="object"/> <arg type="node-set?"/> </prototype> <function>key</function> <function>document</function> </root>
<xsl:key name="func" match="prototype" use="@name"/> <xsl:template match="/"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:template match="function"> <b> <a href="#{generate-id(key('func',.))}"> <xsl:apply-templates/> </a> </b> </xsl:template> <xsl:template match="prototype"> <p><a name="{generate-id()}"> <b>Function: </b> <xsl:value-of select="@name"/> (<xsl:for-each select="arg"> <xsl:value-of select="@type"/> <xsl:if test="not(position()=last())">, </xsl:if> </xsl:for-each>) </a></p> </xsl:template>
上の XML 文書に下のスタイルシートを適用すると以下の出力を得ます。
<html> <p> <a name="N400004"><b>Function: </b>key (string, object) </a> </p> <p> <a name="N40000F"><b>Function: </b>document (object, node-set?) </a> </p> <b><a href="#N400004">key</a></b> <b><a href="#N40000F">document</a></b> </html>
key 関数と generate-id 関数を使用すると上記の例のように参照と定義の間に簡単にハイパーリンクを生成することができます。