目次へ

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>

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp