注:この記事ではXalan XSL Transformationエンジンを使用しますが、他のXSLTプロセッサーでも同じように実行できます。読者がXSL Transformationsに精通していることを前提としています。
この記事では、1つのスタイル・シートを例にとり、文書を実際に変換するときに異なるパラメーター値を入力することによって、異なる結果を生成してみます。このスタイル・シートは、XML文書を読み込んで、ドッグ・ショーの結果を示すHTML文書に変換します。基本となるスタイル・シートは、以下のとおりです。これは、テーブル形式で情報を示すページを作成します。
リスト1: 基本となるスタイル・シート
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="results">
<html>
<head>
<title><xsl:value-of select="@showName" /></title>
<style>
* { font-family: Verdana }
td { font-size: 10pt }
.groupName { font-weight: bold; }
</style>
</head>
<body>
<h2 align="center">
<xsl:value-of select="@showName" />
</h2>
<h4 align="center">
Show Date: <xsl:value-of select="@showDate" />
</h4>
<h4 align="center">
<xsl:value-of select="@location" />
</h4>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="group">
<p class="groupName"><xsl:value-of select="@name"/></p>
<table align="center" width="75%">
<tr><td width="10%">
1st:</td><xsl:apply-templates select="first"/></tr>
<tr><td width="10%">
2nd:</td><xsl:apply-templates select="second"/></tr>
<tr><td width="10%">
3rd:</td><xsl:apply-templates select="third"/></tr>
<tr><td width="10%">
4th:</td><xsl:apply-templates select="fourth"/></tr>
</table>
</xsl:template>
<xsl:template match="first|second|third|fourth">
<td width="40%"><xsl:value-of select="breed"/></td>
<td width="50%"><xsl:value-of select="dog"/></td>
</xsl:template>
<xsl:template match="group[@name='Best In Show']">
<p align="center">
<b>Best In Show:</b>
<xsl:text> </xsl:text>
<xsl:value-of select="first/dog" />
(<xsl:value-of select="first/breed" />)
</p>
</xsl:template>
</xsl:stylesheet>
|
この結果は、図1 に示すようなWebページとなります。
図1. ドッグ・ショーの結果を示すHTML文書
ここで、XSLTスタイル・シートのテンプレートの内側または外側にパラメーターを追加してみましょう。この例では、winnersOnly パラメーターを追加して、初期値no を指定します。
リスト2: パラメーターを追加する
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="winnersOnly">no</xsl:param>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="results">
...
<h4 align="center"><xsl:value-of select="@location" /></h4>
<h1>The value of winnersOnly is "<xsl:value-of
select="$winnersOnly"/>"</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
|
上記では、パラメーターに初期値no を指定しましたが、実行時に異なる値を指定することができます。どんな値を選択する場合でも、一般的なXPath式の場合と同じように、value-of 要素に$winnersOnly を表記することによってアクセスすることができます。
Xalanを使用する場合、以下のコマンドを使用してこの変換を実行することができます。
java org.apache.xalan.xslt.Process -in scores.xml -xsl scores.xsl
-out results.html-param winnersOnly yes
|
こうすると、値が指定され、図2 に示すページが出力されます。
図2. パラメーターに値yesを指定した場合の出力
では、パラメーターを使用して何を行うことができるでしょうか。結果の文書の一部として出力できることに加えて、選択を行うことができます。たとえば、if 要素を使用すると、winnersOnly パラメーターがyes に設定される場合に、特定のテキストが出力されるように指定することができます。
リスト3: xsl:if要素を使用する
...
<h4 align="center"><xsl:value-of select="@location" /></h4>
<xsl:if test="$winnersOnly='yes'">
<h2 align="center">WINNERS</h2>
</xsl:if>
<xsl:apply-templates/>...
|
この場合、特定の条件またはtestがtrueであるかどうかどうかが判別されます。この条件はパラメーターの値に基づいて判別されます。$winnersOnly='yes' がtrueである場合、内容が評価されます (この例では、表示されます)。
if 要素は単純な選択の場合に有効ですが、else 要素がないため、複雑な状況では使用できません。しかし、if-then-elseタイプのテストは実行できないとあきらめる必要はありません。その場合は、xsl:choose 要素を使えばよいのです。
リスト4: xsl:choose要素を使用する
_
<xsl:template match="group">
<xsl:choose>
|
この場合、testがtrue と評価される場合、when ブロックの内容が評価されて表示されます。trueと評価されない場合、otherwise ブロックの内容が評価されて表示されます。
今回の場合、winnersOnly パラメーターをyes に変更すると、図3 に示す結果が表示されます。
図3. choose要素を使用する場合の出力結果
この記事では、XSLTスタイル・シートでパラメーターおよび条件ステートメントを使用するための、非常に基本的な方法を取り上げました。パラメーターの利点は、実行時にそれらを指定できることですが、その機能はコマンド行から実行される変換には限定されていません。ほとんどのエンジンで、プログラマチックに実行する場合にも同様に変換を指定することができます。
- W3CのXSLT 1.0勧告 を参照してください。
- XML関連の多くの資料を、developerWorksのXMLゾーンで調べることができます。
-
XMLおよびその関連テクノロジーのIBM Certified Developer になる方法をお調べください。
- この記事のようなXML情報を毎週購読することをお望みですか? developerWorksXML Tips newsletter をお申し込みください。
