実践XSLT 「やさしいXSLTの書き方」
第4回:XSLTを実際に書いてみる-その2
(株)日本ユニテック
青木 秀起
1.イントロダクション
いよいよ「やさしいXSLTの書き方」も最終回となりました。今回は先回に引き続きプログラミング的な要素(一覧表参照)と、ノードを生成するための要素をご紹介します。顧客管理情報を例にとって実際に書いてみましょう!まず、顧客情報ファイルとそれを一覧表示するXSLファイルを同じディレクトリにダウンロードし(このファイルはZIP形式で圧縮されています)、IEで表示してください。うまく表示できたら、以下の学習に進んでください。
2.条件付き処理(xsl:if、xsl:choose、xsl:when、xsl:otherwise)
<xsl:if test="price<1000">
・・・・・・
</xsl:if> |
図1 xsl:ifの書き方
図1のように、xsl:ifは、"test"の値が真(true)のときに、処理を実行します。この例では、商品の価格が1000円より小さい場合に処理を実行します。
xsl:ifを使って、「建設業の会社だけを表示する」ようXSLファイルを修正してください。次の文を、<xsl:for-each
select="company" >の下に挿入します。
<xsl:if test="type[@type-num='2']" >
・・・・・・
</xsl:if> |
図2 建設業の会社を指定するxsl:ifの書き方
図2では、type要素のtype-num属性の値が2(建設業)である場合に処理を実行(表を作成)します。修正したらXSLファイルを保存し、サンプル・ファイルをIEで表示して建設業の会社だけが表示されているかを確認してください(うまく表示されない場合、正しいXSLファイルをダウンロードして比較してください)。
③ 複数の条件から選択する場合(xsl:choose、xsl:when、xsl:otherwise) |
図3 複数の条件から選択する場合の書き方
図3のように、xsl:chooseは単独では用いられず、xsl:when(必須)とxsl:otherwise(なくても良い)がその子要素となります。xsl:whenは、"test"の値が真(true)のときに処理を実行します。すべてのxsl:when条件を満たさない場合にxsl:otherwiseの処理が実行されます。xsl:otherwiseが記述されていないときには何も生成されません。
④ 実際にxsl:choose、xsl:when、xsl:otherwiseを書いてみよう! |
xsl:choose、xsl:when、xsl:otherwiseを使って、次の条件を満たすようXSLファイルを修正してください。
(1)従業員数が1000人以上の企業については、「会社名」、「本社所在地」、「電話番号」、「メール・アドレス」、「担当者」、「従業員数」、「業種」、「備考」のすべてを表示します。
(2)それ以外の企業については、「会社名」と「本社所在地」のみを表示します。
(3)従業員数(scale)をソートキーとして降順に並べ替えます。
次のようにXSLファイルを修正してください。
図4 xsl:choose、xsl:when、xsl:otherwiseの実際の書き方
並べ替えについては、第3回で学習したxsl:sortを使います。XSLファイルを保存し、サンプル・ファイルをIEで表示して、建設業の会社だけが表示されているかを確認してください(うまく表示されない場合、正しいXSLファイルをダウンロードして比較してください)。
3.ノードを生成する出力系要素
次にノードを生成する出力系の要素を考えてみましょう。以下の6つを取り上げてみます。一覧表もご覧ください。
<product>
<xsl:attribute name="prod-id" >
<xsl:value-of select="id">
</xsl:attribute>
<xsl:value-of select="proname">
</product>
|
<product>
<id>SD-2546-3S</id>
<proname>事務用デスクS型</proname>
</product>
|
図5 xsl:attributeの書き方 |
図6 ソース文書 |
|
<product prod-id="SD-2546-3S">
事務用デスクS型
</product> |
図7 図6の変換結果 |
図7のようにproduct要素にprod-idという名前の属性が追加され、その属性値としてid要素の内容が入れられます。xsl:attributeは、name属性(必須)に指定した名前の属性を追加します。
<xsl:comment>
この製品は7月1日で製造中止になります。
</xsl:comment> |
図8 xsl:commentの書き方
|
<!-- この製品は7月1日で製造中止になります。--> |
図9 図8による変換結果 |
図9のように変換されます。xsl:commentの要素内容部分がコメントにされます。
<xsl:template match="header">
<xsl:element name="h1" >
<xsl:value-of select="header">
</xsl:element>
|
<header>
顧客管理リスト
</header>
|
図10 xsl:elementの書き方 |
図11 ソース文書 |
|
<h1>顧客管理リスト</h1> |
図12 図11の変換結果 |
xsl:elementは、name属性(必須)に指定した名前の要素を生成します。図12のように変換されます。
④ xsl:processing-instruction(処理命令の生成) |
<xsl:processing-instruction name="product-list"
>
src="prod200108.xml"
</xsl:processing-instruction> |
図13 xsl:processing-instructionの書き方
|
<?product-list src="prod200108.xml"?> |
図14 図13による変換結果 |
xsl:processing-instructionは、name属性(必須)に指定した名前の処理命令を、図14のように生成します。
<xsl:text>
弊社ホームページに引合いあり
</xsl:text> |
図15 xsl:textの書き方
|
弊社ホームページに引合いあり |
図16 図15による変換結果 |
xsl:text要素の内容をそのままテキストとして生成します。
⑥ xsl:value-of(指定したノードをテキストとして生成) |
<prod-num>
<xsl:value-of select="@num" />
</prod-num>
|
<product num="SD-2378-KS">
ERPパッケージWiz2001(Windows版)
</product>
|
図17 xsl:value-ofの書き方 |
図18 ソース文書 |
|
<prod-num>
SD-2378-KS
</prod-num> |
図19 図18の変換結果 |
sl:value-ofは、select属性に指定された属性値の文字列をテキストとして生成します。この例では、product要素のnum属性の属性値をprod-num要素の内容にしています。
4.まとめ
このように、XSLTの変換機能を駆使すれば、XMLを自由に加工し、HTMLに変換することができます。出力を意識せずにXMLとしてデータを管理することができます。4回にわたりXSLTの機能やメリットを概説してきました。粗筆でしたが皆様のご愛読に感謝致します。
要素
|
属性
|
説明
|
xsl:for-each |
select(必須) |
繰り返し処理を行う |
xsl:sort |
select(ソートキーの指定)、lang(ソートキーの言語の指定)data-type(ソートキーのデータ型の指定)order(昇順か降順かの指定)case-order(大文字小文字の優先の指定) |
ノードの並べ替えを行う |
xsl:if |
test(必須) |
条件が真(true)の時に処理を行う |
xsl:choose |
|
複数の選択肢から処理を選択する |
xsl:when |
test(必須) |
条件が真(true)の時に処理を行う |
xsl:otherwise |
|
xsl:when要素が全て偽(false)の時に処理を行う |
要素
|
属性
|
説明
|
<xsl:attribute> |
name(必須、追加する属性の名前)
namespace(適用されるURI) |
属性を生成 |
<xsl:comment> |
|
コメントの生成 |
<xsl:element> |
name(必須、生成する要素の名前)
namespace(適用されるURI)
use-attribute-sets(属性の集合を定義) |
要素の生成 |
<xsl:processing-instruction> |
name(必須、生成する処理命令の名前) |
処理命令の生成 |
<xsl:text> |
disable-output-escaping(エスケープ処理をするか否か(yes|no) |
テキストの生成 |
<xsl:value-of> |
select(必須)
disable-output-escaping(エスケープ処理をするか否か(yes|no) |
指定したノードをテキストとして生成 |
>>次の記事「DOMを使うと何が変わるか?」
関連サービス
IT技術およびIT製品の可用性調査・検証業務
関連キーワード: XML変換
関連キーワード: XSLT
|