|
<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関数を使用した簡単なサンプルです。
■ id-aaa.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="idbbb.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>
■ idbbb.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型の属性を
記述しています。idbbb.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="keybbb.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>
■ keybbb.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> |
Copyright © 2006 - ykr414 . All Rights Reserved. |