スタイルシート変換言語 XSLT

<xsl:key>  id関数と同じ処理を行う場合の解説です。  スタイルシート変換言語 XSLTリファレンス 

<xsl:key> id関数と同じ処理を行う

<xsl:key 
name="qname" 
match="pattern" 
use="expression" />
xsl:keyは、要素への参照を示す名前(キー名)を宣言します。 トップレベル要素の位置に記述し、key関数で、xsl:keyによって宣言された キーの名前・値を持つノードを得ることができます。
key関数と似たような働きをする関数にid関数があります。非常に便利な関数なのですが id関数を使用するに当たっては制限が厳しく、また限界があります。 それらの欠点を取り去ったのがkey関数だと思ってよいでしょう。 但しこの文章だけでは非常にわかりにくいので、下記に例をあげ「xsl:key」と「 key関数」について解説します。 (長くなるので2回に分けて解説します。)
■ここで作成するサンプル
XML文書(id-bbb.xslを適用) : id-aaa.xml
XML文書(key-bbb.xslを適用) : key-aaa.xml
id関数を記述したXSLTスタイルシート : id-bbb.xsl
key関数を記述したXSLTスタイルシート : key-bbb.xsl
CSS文書 : ccc.css
まず、id関数を使用した簡単なサンプルです。
zipファイル 以下のサンプルをダウンロード(ZIP圧縮)
■ id-aaa.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="id–bbb.xsl"?>

<!DOCTYPE item [
<!ELEMENT item (book+)>
<!ELEMENT book (name, val, stock)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT val (#PCDATA)>
<!ELEMENT stock (#PCDATA)>
<!ATTLIST book number ID #REQUIRED>
]>

<item>

<book number="b001">
<name>誰でも簡単XML</name>
<val>1800</val>
<stock>18</stock>
</book>

<book number="b002">
<name>XSLTを使いこなす</name>
<val>3200</val>
<stock>27</stock>
</book>

<book number="b003">
<name>楽々自動化「XML&XSLT」</name>
<val>2900</val>
<stock>10</stock>
</book>

</item>
■ id–bbb.xsl
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<head>
<link rel="stylesheet" href="ccc.css" />
</head>
<body>
 <table cellspacing="0">
  <tr>
   <th width="180">商品名</th>
   <th>価格</th>
   <th width="180">在庫数</th>
  </tr>
  <xsl:apply-templates select="id('b003')" />
 </table>
</body>
</html>
</xsl:template>

<xsl:template match="book">
 <tr>
  <td>
  <xsl:value-of select="name" />
  </td>
  <td class="aka">
  <xsl:value-of select="val" />円
  </td>
  <td>
  <xsl:apply-templates select="stock" />冊
  </td>
 </tr>
</xsl:template>

</xsl:stylesheet>
■ ccc.css
table {width:500px}
th {background-color:#99ff66;padding:3px}
td {padding:5px;line-height:150%;border-color:#333333;
border-width:1px;border-style:solid}
.aka {color:#990000}
サンプル
上記のid-aaa.xml文書のbook要素には「number="xxx"」というid型の属性を 記述しています。id–bbb.xsl文書内で、id('b003') と記述している箇所がありますが、これがid関数です。id関数は、指定された値と 一致するid属性値を持つ要素のノードを返します。
このid属性の部分を、もし関数を使用せずに記述すると・・
item/book[@number='b003']
と記述しなくてはなりません。id属性を使用するといかに記述が簡潔になるかという事が わかると思います。しかし、冒頭でも申し上げたように、id属性を使用するにはいくつかの 制限があります。
・ DTDなどのスキーマを参照する為、ID属性が定義されていなくては使用できない。
・ 1つの要素では1つしかIDを持つ事ができない。
・ IDは属性でなくてはならない。
・ IDの値の先頭が数値であったり、値の中にスペースが混じってはいけない。
これを見る限りid関数にはとても制限が多く、利用法にも限界のあることがわかります。 そこでkey関数を使用します。下記のサンプルをご覧下さい。key-aaa.xmlは id-aaa.xmlと内容自体は変わりませんが、 key関数がいかに便利であるかを示す為、DTDの記述を省き簡潔にしています。
■ key-aaa.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="key–bbb.xsl"?>

<item>

<book number="b001">
<name>誰でも簡単XML</name>
<val>1800</val>
<stock>18</stock>
</book>

<book number="b002">
<name>XSLTを使いこなす</name>
<val>3200</val>
<stock>27</stock>
</book>

<book number="b003">
<name>楽々自動化「XML&XSLT」</name>
<val>2900</val>
<stock>10</stock>
</book>

</item>
■ key–bbb.xsl
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="booknumber" match="book" use="@number" />

<xsl:template match="/">
<html>
<head>
<link rel="stylesheet" href="ccc.css" />
</head>
<body>
 <table cellspacing="0">
  <tr>
   <th width="180">商品名</th>
   <th>価格</th>
   <th width="180">在庫数</th>
  </tr>
  <xsl:apply-templates select="key('booknumber','b003')" />
 </table>
</body>
</html>
</xsl:template>
<xsl:template match="book">
 <tr>
  <td>
  <xsl:value-of select="name" />
  </td>
  <td class="aka">
  <xsl:value-of select="val" />円
  </td>
  <td>
  <xsl:apply-templates select="stock" />冊
  </td>
 </tr>
</xsl:template>

</xsl:stylesheet>
サンプル
<xsl:key name=" キー名 " match=" キーを定義するノード " use=" matchに割り当てられるキー値 " />
key関数はXSLTスタイルシート中のトップレベル要素の位置に記述し、 キー名を宣言します。
このように、上記のサンプルでは、id関数使用時と表示結果は同じですが、key関数を使用 するメリットは沢山あります。まずid関数ではIDに属性しか指定する事が出来なかったのに対し、 key関数では子要素もIDのように扱えます。また、一つの要素に複数のID型を使うこと ができたりもします。
なので次回は、「1つのXML文書に複数のKeyを設定」する例をあげて、さらにxsl:keyと key関数について解説したいと思います。
XSLT要素一覧
+ <xsl:apply-imports>
+ <xsl:apply-templates>
+ <xsl:attribute>
+ <xsl:attribute-set>
+ <xsl:call-template>
+ <xsl:comment>
+ <xsl:copy>
+ <xsl:copy-of>
+ <xsl:decimal-format>
+ <xsl:element>
+ <xsl:fallback>
+ <xsl:for-each>
+ <xsl:if>
+ <xsl:import>
+ <xsl:include>
+ <xsl:key>
+ <xsl:message>
+ <xsl:namespace-alias>
+ <xsl:number>
+ <xsl:otherwise>
+ <xsl:output>
+ <xsl:param>
+ <xsl:preserve-space>
+ <xsl:processing-instruction>
+ <xsl:sort>
+ <xsl:strip-space>
+ <xsl:stylesheet>
+ <xsl:template>
+ <xsl:text>
+ <xsl:value-of>
+ <xsl:variable>
+ <xsl:when>
+ <xsl:with-param>