実践XSLT 「やさしいXSLTの書き方」
第3回:XSLTを実際に書いてみる-その1
(株)日本ユニテック
青木 秀起
1.イントロダクション
先回考えたように、テンプレート・ルールはテンプレートとパターンで構成され、パターンにマッチするノードに対してテンプレート・ルールがインスタンス化されます。今回は、企業の商品管理情報をXMLからHTMLに変換する例を取り上げながら、以下の二点を解説します。
①「どのノードに対して」:ノード位置の指定法(XPath)
②「どんな処理をするのか」:処理の指定(繰り返し処理 (xsl:for-each) 、ソート処理 (xsl:sort))
2.ノード位置の指定法(XPath)
ノード位置は、以下の例の 線部分のように指定します。
<xsl:apply-templates select="document/h1"
> |
documentの下のh1という要素を処理するように指定しています。"/"は、相対ロケーション・パスを合成します。
<xsl:apply-templates select="document | manual"
> |
documentとmanualという要素を処理するように指定しています。"|"は、和集合を表します。
<xsl:apply-templates select="document[@by='2000']"
> |
documentという要素の中でby属性の値が2000である要素を処理するように指定しています。属性名の前に"@"を付けて属性値を参照することができます。
この他にもXPathではさまざまな演算子が定義されていて、細かく位置を特定できるようになっています。また、指定の幅を広げるために以下の4つの基本型が定義されています(一覧表もご覧ください)。
1.ノード集合関数・・・・ノード集合についての関数
2.数値関数・・・・・・・数値を返す関数
3.文字列関数・・・・・・文字列についての関数
4.ブール値関数・・・・・true(真)かfalse(偽)を返す関数
<例4> ノード集合関数(position()=) |
<xsl:apply-templates select="document[position()=2]"
> |
2番目に出現するdocument要素を処理するように指定します。position()は何番目に出現する要素かを示します。
<xsl:value-of select="sum(/price)"/ > |
該当する各ノードの合計数値を返します。sum()は、ある要素の数値をすべて加算した値を返してくれます。
<例6> 文字列関数(string-length()) |
<xsl:value-of select="string-length(.)"/ > |
該当するノードの文字列の文字数を返します。
<xsl:when test="lang('japanese')"> |
言語がjapaneseであるか否かを確認しています。japaneseであればtrue(真)を、japanese以外の言語であればfalse(偽)を返します。このように、ブール値関数とは、true(真)またはfalse(偽)のいずれかの値を返す関数です。
3.処理の指定(xsl:for-each、xsl-sort)
<xsl:for-each select="item" >
・・・変換処理の指定・・・
</xsl:for-each> |
XMLファイル中に同じ要素がいくつも存在する場合、上記のように書くだけで繰り返し処理を行ってくれます。
属性名
|
説明
|
select |
ソートキーとなるノードの文字列を指定 |
lang |
ソートキーの言語の指定。RFC 1766を使用 |
data-type |
ソートキーのデータ型を指定。
●“text”:テキスト
●“number”:数値
●“qname-but-not-ncname”:修飾名 |
order |
昇順(“ascending”)か降順(“descending”)の指定 |
case-order |
大文字優先(“upper-first”)か小文字優先(“lower-first”)の指定 |
表1 xsl:sort命令の属性
4.実際に書いてみよう!
さて、これまで学習した内容をもとに、XSLファイルを実際に書いてみましょう。XML文書として管理していた商品管理ファイルを、会社のホームページに「商品ラインナップ」としてアップすることになりました。その一部をご覧ください
◆サンプルXMLファイル「sample3.xml」と見本XSLTファイル「style3.xsl」をダウンロード(このファイルはZIP形式で圧縮されています)
<product>
<title>商品ラインナップ</title>
<item>
<name>2穴パンチ</name><maker>カーラ事務器</maker><price>400</price><class>3</class>
<num>NO-232-A</num>
</item>
<item>
<name>多穴パンチ</name><maker>カーラ事務器</maker><price>5400</price><class>3</class>
<num> SQ-50-A </num>
</item>
・・・・・・
</product> |
図1 商品管理ファイルのサンプル
それでは、メモ帳などのエディタを開き、style3.xslというファイル名を付けてください。以下の手順に従って書いていきます。
① XSLファイルのフレームを書きます(第2回をご覧ください) |
<?xml version="1.0" encoding="shift_jis"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml1/strict">
<xsl:template match="/">
<html>
<body>
<div>
<xsl:apply-templates/>
</div>
</body>
</html>
</xsl:template>
・・・・・・ <<ここに以下の②と③の処理を記述します
</xsl:stylesheet> |
図2 XSLファイルのフレーム部分
<xsl:template match="title">
<h1 align="center"><xsl:value-of select="."/></h1>
</xsl:template> |
図3 見出しの生成
③ xsl:for-eachを使って表を生成します |
<xsl:template match="product" >
<table border="1" align="center"> |
<tr align="center">
<th>商品名</th>
<th>メーカー</th>
<th>価格</th>
<th>商品分類</th>
<th>商品番号</th>
</tr> |
|
<xsl:for-each select="item"
>
<tr>
<td><xsl:value-of
select="name" /></td>
<td align="center"><xsl:value-of
select="maker" /></td>
<td align="right"><xsl:value-of
select="price" /></td>
<td align="center"><xsl:value-of
select="class" /></td>
<td align="center"><xsl:value-of
select="num" /></td>
</tr>
</xsl:for-each> |
|
</table>
</xsl:template> |
図4 表の生成
たくさんある商品データベース・ファイルを、これだけの命令で全部変換してくれます。ここまで書いたらXSLファイルを保存し、サンプル・ファイルをIEで表示してみてください。次のように表示されるはずです。
図5 サンプル・ファイルの表示例
最後にxsl:sortを使ってソートしてみましょう。
図4の<xsl:for-each select="item" >行と<tr>行の間に次のソート命令を追加します。
<xsl:sort select="class" data-type="number"
order="ascending"/> |
ソート命令
上記のソート命令の例では、商品分類(number)をソートキーにして、昇順(ascending)に並べ替えるように指定しています。この一行を加えるだけで図5は次のように並べ替えられます。
図7 ソート後のサンプル・ファイルの表示例
このように、XSLT変換機能を活用することによって、膨大なデータを一括変換したり加工することが可能なのです。また前半部分で考えたように、select=""部分に属性を指定してソートキーにすることも可能です。
5.まとめ
今回は、ソース・ツリー上のノードの位置を指定する方法(XPath)と、XSLTのプログラミング的な側面をご紹介しました。「第4回:XSLTを実際に書いてみる-その2」では、さらに詳しいXSLTの書き方をご紹介いたします。
種類
|
演算子
|
説明
|
比較演算子
|
=
|
左の式の値と右の式の値が等しい |
!=
|
左の式の値と右の式の値が等しくない |
<
|
左の式の値が右の式の値よりも小さい |
>
|
左の式の値が右の式の値よりも大きい |
<=
|
左の式の値が右の式の値以下 |
>=
|
左の式の値が右の式の値以上 |
算術演算子
|
+
|
足す |
-
|
引く |
*
|
掛ける |
div
|
割る |
mod
|
余り |
論理演算子
|
and
|
両方の式の値が真の場合真 |
or
|
どちらかの式の値が真の場合真 |
種類
|
関数
|
説明
|
ノード集合関数 |
last |
文脈のサイズを返す |
position |
文脈上の位置を返す |
count |
ノード集合中のノード数を返す |
name |
展開されたノードの名前を返す |
数値関数 |
number |
数値に変換して返す |
sum |
各ノードの合計数値を返す |
round |
四捨五入した整数値を返す |
ceiling |
小数点以下切り上げた整数値を返す |
floor |
小数点以下切り捨てた整数値を返す |
文字列関数 |
string |
文字列に変換して返す |
concat |
文字列を連結して返す |
contains(“a”,”b”) |
文字列aが文字列bを含んでいる場合trueを返す |
substring-before(“a”,”b”) |
文字列bが文字列aの中で最初に見つかった場合、その文字列より前の文字列を返す |
substring-after(“a”,”b”) |
文字列bが文字列aの中で最初に見つかった場合、その文字列より後の文字列を返す |
ブール値関数 |
boolean |
ブール値に変換して返す |
true |
真を返す |
false |
偽を返す |
not |
真偽を反転して返す |
lang |
指定された言語であるかどうかを真偽で返す |
>>次の記事「XSLTを実際に書いてみる-その2」
関連サービス
IT技術およびIT製品の可用性調査・検証業務
関連キーワード: XML変換
関連キーワード: XSLT
|