ホーム > X-Plus > XML Square >  デベロッパーズコーナー  >  実践!XSLT

この記事を送る はてなブックマークに追加する BuzzurlにブックマークBuzzurlにブックマーク Yahoo!ブックマークに登録
テキストリンクコードを取得する

デベロッパーズコーナー:実践!XSLT(3)

2001年07月12日作成 

実践XSLT 「やさしいXSLTの書き方」
第3回:XSLTを実際に書いてみる-その1
   

(株)日本ユニテック
青木 秀起

1.イントロダクション

先回考えたように、テンプレート・ルールはテンプレートとパターンで構成され、パターンにマッチするノードに対してテンプレート・ルールがインスタンス化されます。今回は、企業の商品管理情報をXMLからHTMLに変換する例を取り上げながら、以下の二点を解説します。

    ①「どのノードに対して」:ノード位置の指定法(XPath)
    ②「どんな処理をするのか」:処理の指定(繰り返し処理 (xsl:for-each) 、ソート処理 (xsl:sort))

2.ノード位置の指定法(XPath)

ノード位置は、以下の例の      線部分のように指定します。

 
<例1> "/"の指定

<xsl:apply-templates select="document/h1" >

documentの下のh1という要素を処理するように指定しています。"/"は、相対ロケーション・パスを合成します。

 
<例2> "|"の指定

<xsl:apply-templates select="document | manual" >

documentとmanualという要素を処理するように指定しています。"|"は、和集合を表します。

 
<例3> 属性の指定

<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()は何番目に出現する要素かを示します。

 
<例5> 数値関数(sum())

<xsl:value-of select="sum(/price)"/ >

該当する各ノードの合計数値を返します。sum()は、ある要素の数値をすべて加算した値を返してくれます。

 
<例6> 文字列関数(string-length())

<xsl:value-of select="string-length(.)"/ >

該当するノードの文字列の文字数を返します。

 
<例7> ブール値関数 (lang)

<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を使ってソートしてみましょう。

 
④ 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の書き方をご紹介いたします。



 
XPath演算子一覧

種類
演算子
説明
比較演算子
=
左の式の値と右の式の値が等しい
!=
左の式の値と右の式の値が等しくない
<
左の式の値が右の式の値よりも小さい
>
左の式の値が右の式の値よりも大きい
<=
左の式の値が右の式の値以下
>=
左の式の値が右の式の値以上
算術演算子
+
足す
-
引く
*
掛ける
div
割る
mod
余り
論理演算子
and
両方の式の値が真の場合真
or
どちらかの式の値が真の場合真


 
XPath関数一覧

種類
関数
説明
ノード集合関数 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製品の可用性調査・検証業務





ページトップへ戻る