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

<xsl:key>  1つのXML文書に複数のKeyを設定する場合の解説です。  スタイルシート変換言語 XSLTリファレンス 

<xsl:key> 1つのXML文書に複数のKeyを設定

<xsl:key 
name="qname" 
match="pattern" 
use="expression" />
xsl:keyは、名前(キー名)を指定し、要素への参照を宣言します。 トップレベル要素の位置に記述し、key関数で、xsl:keyによって宣言された キーの名前・値を持つノードを得ることができます。
前回はxsl:keyを使用して、key関数及び、key関数と似たような働きをするid関数について解説しました。 今回はxsl:keyとkey関数を用い、id関数では実現する事のできない「1つの要素に複数のKeyを設定」 する場合の方法について解説します。
zipファイル 以下のサンプルをダウンロード(ZIP圧縮)
■ aaa.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="bbb.xsl"?>

<item>

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

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

<book number="b004">
<name>すぐ使えるテンプレート集</name>
<val>1800</val>
<stock>40</stock>
<cate>XSLT</cate>
</book>

<book number="b005">
<name>XML効率化宣言</name>
<val>2100</val>
<stock>27</stock>
<cate>XML</cate>
</book>

</item>
■ 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="catexml" match="book" use="cate" />
<xsl:key name="catexslt" match="book" use="cate" />

<xsl:template match="/">
<html>
<head>
<link rel="stylesheet" href="ccc.css" />
</head>
<body>
<h1>書籍分類別</h1>
<h2>分類:XML</h2>
 <table cellspacing="0">
  <tr>
   <th width="180">商品名</th>
   <th width="100">分類</th>
   <th>価格</th>
   <th width="140">在庫数</th>
  </tr>
   <xsl:apply-templates select="key('catexml','XML')" mode="cate01" />
 </table>
<h2>分類:XSLT</h2>
 <table cellspacing="0">
  <tr>
   <th width="180">商品名</th>
   <th width="100">分類</th>
   <th>価格</th>
   <th width="140">在庫数</th>
  </tr>
   <xsl:apply-templates select="key('catexslt','XSLT')" mode="cate02" />
 </table>
</body>
</html>
</xsl:template>

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

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

</xsl:stylesheet>
■ ccc.css
h1 {font-size:18px;color:#336633}
h2 {font-size:14px;color:#668866}
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}
上記のbbb.xslスタイルシートでは
<xsl:key name="catexml" match="book" use="cate" />
<xsl:key name="catexslt" match="book" use="cate" />
のように複数のkeyを設定しています。ここではid関数では実現する事のできない子要素をID型として 扱っており、「name属性」ではキー名を、「match属性」ではキーを定義するノード・・ つまりbook要素、「use属性」ではmatchに割り当てられるキー値・・つまりここでは子要素である cateを指定しています。
mode="cate01"
mode="cate02"
それぞれのkeyで、match属性が同じ「book」ノードの集合を返します。 その為、上記のような「mode属性」により、処理を行うテンプレートがどれなのかを指定 しています。
サンプル
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>