連載
» 2002年07月16日 00時00分 公開

技術者のためのXML再入門(9):「シンプルで高機能」なXSLTのプログラミング

第7回から3回連続でXSLTの基本を紹介してきたが、非常にシンプルな言語であることが理解できただろう。XSLTにはプログラミング言語的な機能も備わっている。今回は、「シンプルで高機能」なXSLTのプログラミング的処理を紹介しよう。

[吉田稔, 青木秀起,日本ユニテック]

条件に応じて処理を変える

 XMLデータ(注)の中から、ある条件を満たすものをフィルタリングしたい場合があるだろう。XSLTには、こうした処理を行えるようにxsl:if要素が準備されている。xsl:ifはtest属性を持ち、test属性の式の値が真の場合にはテンプレートが適用され、偽の場合にはテンプレートは適用されない。

(注) W3CによるXMLの仕様書では、XMLで記述された情報を「XML文書(XML Document)」と呼んでいる。しかしXMLは、電子書籍などの文書以外に、電子商取引などのさまざまなデータの記述に用いられる。そこで、本連載ではXMLで記述された文書やデータを総称して「XMLデータ」と呼ぶことにする。


<xsl:if test="ブール値に評価される式">
  ……テンプレート……
</xsl:if>
リスト1 xsl:if要素の書き方

 xsl:if要素は、C言語のif-else文と類似しているが、C言語とは異なり、else文はないことに注意したい。複数の条件を選択して処理したいときには、別のxsl:choose要素を使用する必要がある。

<xsl:choose>
  <xsl:when test="ブール値で評価される式">
    ……テンプレート……
  </xsl:when>
  ……xsl:when要素の繰り返し……
  <xsl:otherwise>
    ……テンプレート……
  </xsl:otherwise>
</xsl:choose>
リスト2 xsl:choose要素の書き方

 xsl:when要素はxsl:if要素とほぼ同じで、test属性の式の値が真の場合にテンプレートが適用される。xsl:when要素はxsl:choose要素にとって必須の要素なので、少なくとも1つは存在しなければならない。xsl:when要素は順番に評価されてゆき、test属性の値が真となる最初のxsl:when要素のテンプレートだけが適用され、その後に続くxsl:when要素についてはtest属性が真かどうかは評価されないことに注意したい。つまり、test属性の値が真となるxsl:when要素を見つけたらxsl:choose要素の処理は終了して残りは処理されないことになる。

 該当するxsl:when要素が1つもない場合、xsl:otherwise要素のテンプレートが適用される。ただしxsl:otherwise要素は任意指定要素なのでなくても構わない。

 では次に、xsl:if要素を使った例を実際に見てみよう。以下の顧客リストのXMLデータ(リスト3)の中から、従業員規模が500人以上の会社をフィルタリング(リスト4)して表示してみよう。

<?xml version="1.0" encoding="shift_jis"?>
<?xml-stylesheet type="text/xsl" href="cusstyle.xsl"?>
<customer>
  <title>顧客リスト一覧</title>
  <company>
    <name>鹿山建設</name>
    <address>茨城県鹿嶋市駒込A丁目B番地C</address>
    <tel>0299-JJJ-KKLL</tel>
    <!-- address:住所、tel:電話番号 -->
    <scale>600</scale>
    <!-- scale:会社の規模(従業員数) -->
  </company>
  <company>
    <name>山本建材</name>
    <address>静岡県清水市馬走D丁目E番地F</address>
    <tel>0543-MM-NNOO</tel>
    <scale>250</scale>
  </company>
  <company>
    <name>相模建設</name>
    <address>神奈川県相模原市栗原G丁目H番地I</address>
    <tel>046-PPQ-XXXX</tel>
    <scale>540</scale>
  </company>
</customer>
リスト3 顧客リストXMLデータ(customer.xml)

<?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>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="title">
    <h1><xsl:value-of select="."/></h1>
  </xsl:template>

  <xsl:template match="company" >
    <xsl:if test="500&lt;=./scale">
    <!-- &lt;は「エンティティ参照」である。
    XMLプロセッサは“<”という文字が出てくると、
    それをタグの開始と認識してしまうので、“&”
    と“;”でエンティティ名を挟んで表現する。-->

    <table border="7">
        <tr>
          <td><xsl:value-of select="./name" /></td>
        </tr>
        <tr>
          <td>本社所在地</td>
          <td><xsl:value-of select="./address" /></td>
        </tr>
        <tr>
          <td>電話番号</td>
          <td><xsl:value-of select="./tel" /></td>
        </tr>
        <tr>
          <td>従業員数</td>
          <td><xsl:value-of select="./scale" /></td>
        </tr>
      </table>
      <br/>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
リスト4 xsl:if要素による条件付き処理(cusstyle.xsl)

 これをInternet Explorerで表示すると次のようになる。従業員数が500以上の会社だけが表示されている。

画面1 xsl:if要素によるフィルタリング結果 画面1 xsl:if要素によるフィルタリング結果

 また、このxsl:if要素は、xsl:message要素とともに使用し、エラーを検出して通知するために使用することができる。以下の例をご覧いただきたい。

<xsl:template match="customer" >
<xsl:if test="100000&lt;=company/scale">
  <xsl:message terminate="yes">
    「従業員数」の数値が間違っています。修正してください。
  </xsl:message>
</xsl:if>
リスト5 xsl:if要素によるエラー通知

 リスト5のように記述しておくと、従業員数が100万人以上の場合、エラー・メッセージを表示してくれる。また、xsl:message要素のterminate属性の値が“yes”の場合、メッセージ発信後XSLT処理を中止する。

繰り返し処理

 XSLTでは、C言語のforループ処理と似た繰り返し処理を行うため、xsl:for-each要素が用意されている。xsl:for-each要素は、選択されたノード集合に対して同じテンプレートを適用する場合に活用される。xsl:for-each文は次のように書くことができる。

<xsl:for-each select="ノード集合を返す式">
    ……テンプレート……
</xsl:for-each>
リスト6 xsl:for-each要素の書き方

 リスト3のXMLデータから、会社名、住所、従業員数だけを抽出して表形式に表示する場合、xsl:for-eachを使って書くと次のようになる。

<?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>
      <body>
       <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="customer">
    <h1><xsl:value-of select="./title"/></h1>
    <table border="7">
      <xsl:for-each select="company">
        <tr>
          <td><xsl:value-of select="./name" /></td>
          <td><xsl:value-of select="./address" /></td>
          <td><xsl:value-of select="./scale" /></td>
        </tr>
      </xsl:for-each>
    </table>
    <br/>
  </xsl:template>
</xsl:stylesheet>
リスト7 xsl:for-each要素による繰り返し処理

画面2 xsl:for-each要素による繰り返し処理結果 画面2 xsl:for-each要素による繰り返し処理結果

 このように、xsl:for-each要素によって繰り返し処理を行うなら、大きなデータでも一括変換することができる。

ソート処理

 ここまでで条件付き処理と繰り返し処理を紹介したが、さらにプログラミングに近い機能を紹介しよう。抽出したデータをソート処理したい場合があるが、そのためにXSLTでは、xsl:sort要素が用意されている。

<xsl:sort
  select="ソートキーとなる文字列を返す式"
  lang="ソートキーの言語“
  data-type={"text(テキスト)"|"number(数値)"|"qname-but-not-ncname"}
  order="{"ascending(昇順)"|"descending(降順)"}
  case-order={"upper-first(大文字優先)"|"lower-first(小文字優先)"}
/>
リスト8 xsl:sort要素の書き方

 xsl:sort要素は、xsl:for-each要素とxsl:apply-templatesの子要素として用いられることに注意したい。例えば、顧客リストデータの中から、従業員規模が大きいものから順に並べ替えて変換表示することができる。リスト7のxsl:for-each要素の下に、xsl:sort要素を挿入すると次のようになる。

<?xml version="1.0" encoding="shift_jis"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  ……省略……
  <xsl:template match="customer">
    <h1><xsl:value-of select="./title"/></h1>
    <table border="7">
      <xsl:for-each select="company">
        <xsl:sort select="./scale" order="descending"/>
        <tr>
         <td><xsl:value-of select="./name" /></td>
          <td><xsl:value-of select="./address" /></td>
          <td><xsl:value-of select="./scale" /></td>
        </tr>
      </xsl:for-each>
    </table>
    <br/>
  </xsl:template>
</xsl:stylesheet>
リスト9 xsl:sort要素による並べ替え

画面3 xsl:sort要素による並べ替え結果 画面3 xsl:sort要素による並べ替え結果

次回で扱う内容

 第7回から第9回まででXMLの構造変換言語XSLTについて解説した。次回は、XSLTよりデータ操作性に優れたDOM/SAXを紹介する。XSLTとDOMは似た機能を持っているが、DOMを使えば動的なデータ操作が可能になる。ビジネスへのXML導入を考えるとき、DOMやSAXなどの共通APIについての知識は重要であろう。

さらにXSLTを知るための関連記事

XML eXpert eXchangeフォーラムには、すでにXSLTに関する詳しい記事がいくつか掲載されている。それらを紹介しておこう。(編集局)

集中連載:XSLTスタイルシート書き方講座」は、系統だててXSLTの基礎から応用までが学べる連載だ。筆者の1人は、この連載でもおなじみの日本ユニテックの吉田氏。

サンプルで覚える XSLTプログラミング」は、XSLTのさまざまな要素の説明と使用例のリファレンス的な記事。「連載:XMLサーバ/Cocoon自由自在!」は、サーバサイドでXSLTを実行するXMLサーバ「Cocoon」を詳しく解説している。




Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。