検索
連載

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

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

PC用表示 関連情報
Share
Tweet
LINE
Hatena

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

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

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


*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 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)して表示してみよう。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

繰り返し処理

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

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

ソート処理

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

画面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.

ページトップに戻る