XSLT 6章 追加の関数
- 6.1 複数のソースドキュメント
- 6.2 キー
- 6.3 数字のフォーマット
- 6.4 その他の追加関数
6.2 キー
相互参照を可能とする仕組みとして XPath の id 関数があります。しかし、id 関数で扱う ID には以下のような制限があります。
- ID 型の属性は、DTD 内で宣言されていなければならない。
- ドキュメントはユニークな ID の集合を 1つしか持つことができない。
- 要素の ID を指定できる場所は属性だけであり、要素内や子要素による指定はできない。
- ID には XML の要素と属性の名前に使用できる文字以外使用できない。
- 要素がもてる ID は最大 1つである。
- 特定の ID をもてる要素は最大 1つである。
一方、キーは一般化された ID であるため、このような制限はありません。
<xsl:key name = qname match = pattern use = expression />
キーの宣言は、xsl:key 要素を用いて行います。xsl:key 要素の属性はすべて必須です。name 属性には、キーの名前を指定します。match 属性には、このキーを持つノードを指定する XSLT のマッチパターンを指定します。use 属性には、キーの値を XPath 式で指定します。
node-set key(string, object)
key 関数は、指定した名前と値からなるキーを持つ、ソース文書内のすべてのノードを含むノード集合を返します。ここで指定するキーの名前と値は、上で説明した xsl:key 要素を使ってノードに割り当てられたものです。2つある引数はいずれも必須です。1番目の引数にはキーの名前を、2番目の引数にはキーの値を指定します。2番目の引数が node-set 型の場合は、引数であるノード集合が含む各ノードの文字列値にそれぞれ適用されます。それ以外の型である場合は string 型に変換してから適用されます。
<?xml version="1.0"?> <people> <person no="1">Kevin Shields</person> <person no="2">Trent Reznor</person> <person no="3">Kurt Cobain</person> <person no="4">Richard Ashcroft</person> </people>
<xsl:key name="disp" match="people/person" use="@no"/> <xsl:template match="/"> <people> <xsl:for-each select="key('disp', '3')"> <xsl:copy-of select="." /> </xsl:for-each> </people> </xsl:template>
上の XML 文書に下のスタイルシートを適用すると以下の出力を得ます。
<people><person no="3">Kurt Cobain</person></people>