第7回から3回連続でXSLTの基本を紹介してきたが、非常にシンプルな言語であることが理解できただろう。XSLTにはプログラミング言語的な機能も備わっている。今回は、「シンプルで高機能」なXSLTのプログラミング的処理を紹介しよう。
XMLデータ(注)の中から、ある条件を満たすものをフィルタリングしたい場合があるだろう。XSLTには、こうした処理を行えるようにxsl:if要素が準備されている。xsl:ifはtest属性を持ち、test属性の式の値が真の場合にはテンプレートが適用され、偽の場合にはテンプレートは適用されない。
<xsl:if test="ブール値に評価される式"> |
リスト1 xsl:if要素の書き方 |
xsl:if要素は、C言語のif-else文と類似しているが、C言語とは異なり、else文はないことに注意したい。複数の条件を選択して処理したいときには、別のxsl:choose要素を使用する必要がある。
<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"?> |
リスト3 顧客リストXMLデータ(customer.xml) |
<?xml version="1.0" encoding="shift_jis"?> |
リスト4 xsl:if要素による条件付き処理(cusstyle.xsl) |
これをInternet Explorerで表示すると次のようになる。従業員数が500以上の会社だけが表示されている。
また、このxsl:if要素は、xsl:message要素とともに使用し、エラーを検出して通知するために使用することができる。以下の例をご覧いただきたい。
<xsl:template match="customer"
> |
リスト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="ノード集合を返す式"> |
リスト6 xsl:for-each要素の書き方 |
リスト3のXMLデータから、会社名、住所、従業員数だけを抽出して表形式に表示する場合、xsl:for-eachを使って書くと次のようになる。
<?xml version="1.0" encoding="shift_jis"?> |
リスト7 xsl:for-each要素による繰り返し処理 |
このように、xsl:for-each要素によって繰り返し処理を行うなら、大きなデータでも一括変換することができる。
ここまでで条件付き処理と繰り返し処理を紹介したが、さらにプログラミングに近い機能を紹介しよう。抽出したデータをソート処理したい場合があるが、そのためにXSLTでは、xsl:sort要素が用意されている。
<xsl:sort |
リスト8 xsl:sort要素の書き方 |
xsl:sort要素は、xsl:for-each要素とxsl:apply-templatesの子要素として用いられることに注意したい。例えば、顧客リストデータの中から、従業員規模が大きいものから順に並べ替えて変換表示することができる。リスト7のxsl:for-each要素の下に、xsl:sort要素を挿入すると次のようになる。
<?xml version="1.0" encoding="shift_jis"?> |
リスト9 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.