ヒント: XSLTパラメーターを使用して実行時に選択を行う

スタイル・シートでパラメーターおよび条件を指定する

Extensible Stylesheet Langauage Transformations (XSLT) は、データをある形式から別の形式へ変換する場合に、高度な操作を可能にします。実行時にパラメーターを指定することによって、さらに高度な変換が可能になります。この記事では、XSLTスタイル・シートでパラメーターと条件ステートメントを使用する基本的な方法を紹介しましょう。

Nicholas Chase (nicholas@nicholaschase.com), President, Chase and Chase, Inc.

Nicholas ChaseNicholas Chase は、Lucent Technologies や Sun Microsystems、Oracle、the Tampa Bay Buccaneers などの会社で Web 開発に携わってきました。彼は高校の物理の先生であり、低レベル放射性廃棄物施設の管理者であり、オンライン SF 雑誌の編集者であり、マルチメディアのエンジニアであり、Oracle インストラクターであり、あるインタラクティブ・コミュニケーション会社の最高技術責任者でもあります。『XML Primer Plus』(Sams 刊) を含めて、何冊かの著作があります。



2002年 8月 01日

注:この記事では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文書
図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を指定した場合の出力
図2. パラメーターに値yesを指定した場合の出力

xsl:if要素を使用する

では、パラメーターを使用して何を行うことができるでしょうか。結果の文書の一部として出力できることに加えて、選択を行うことができます。たとえば、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である場合、内容が評価されます (この例では、表示されます)。


xsl:choose要素を使用する

if 要素は単純な選択の場合に有効ですが、else 要素がないため、複雑な状況では使用できません。しかし、if-then-elseタイプのテストは実行できないとあきらめる必要はありません。その場合は、xsl:choose 要素を使えばよいのです。

リスト4: xsl:choose要素を使用する
_
<xsl:template match="group">
<xsl:choose>
<xsl:when test="$winnersOnly='yes'"> <p align="center"> <b><xsl:value-of select="@name"/>:</b> <xsl:text> </text> <xsl:value-of select="first/dog" /> (<xsl:value-of select="first/breed" />) </p> </xsl:when>
<xsl:otherwise> <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:otherwise>
</xsl:choose> </xsl:template> _

この場合、testがtrue と評価される場合、when ブロックの内容が評価されて表示されます。trueと評価されない場合、otherwise ブロックの内容が評価されて表示されます。

今回の場合、winnersOnly パラメーターをyes に変更すると、図3 に示す結果が表示されます。

図3. choose要素を使用する場合の出力結果
図3. choose要素を使用する場合の出力結果

要約

この記事では、XSLTスタイル・シートでパラメーターおよび条件ステートメントを使用するための、非常に基本的な方法を取り上げました。パラメーターの利点は、実行時にそれらを指定できることですが、その機能はコマンド行から実行される変換には限定されていません。ほとんどのエンジンで、プログラマチックに実行する場合にも同様に変換を指定することができます。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML
ArticleID=242730
ArticleTitle=ヒント: XSLTパラメーターを使用して実行時に選択を行う
publish-date=08012002