XSLTとは何か、XSLTの変換、要素、使い方を例示して説明します。 また、XSLT変換コードを開発するためのXPathの重要性についても説明します:
XSL」は「Extensible Stylesheet Language」の短縮形、「T」は「Transformation」の短縮形である。
つまり、基本的にXSLTは、XSL-FO(Formatting Objects)などを使って、ソースとなるXML文書をXML文書に変換したり、HTMLやPDFなどの他のフォーマットに変換したりするための変換言語なのです。
XSLT入門
XSLTプロセッサ(Saxon、Xalanなど)は、1つまたは複数のXML文書をソースとして、XSLTコードを記述した1つのXSLTファイルを作成し、下図のような結果/出力文書を生成する。
XSLTプロセッサは、X-Pathを使用してソースXML文書を解析し、ルート要素から文書の終わりまで、さまざまなソース要素をナビゲートします。
あなたが知るべきすべてのこと エックスパス
XSLTの変換
変換を開始するには、XSLTコードが実行される1つのXML文書、XSLTコードファイル自体、およびXSLTプロセッサを持つツールまたはソフトウェア(学習目的のためにソフトウェアの無料版または試用版を使用することができます)が必要です。
#その1)XMLコード
以下は、XSLTコードが実行されるソースXMLコードです。
ファイル名です: 書籍.xml
XSLT Programmer's Reference Michael Kay Wrox $40 4th Head First Java Kathy Sierra O'reilly $19 1st SQL The Complete Reference James R. Groff McGraw-Hill $45 3rd
#その2)XSLTコード
以下は、上記のXML文書に対して実行されるXSLTのコードです。
ファイル名です: Books.xsl
書籍: -
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|---|---|---|---|---|
#3)結果/出力コード
上記のXML文書にXSLTコードを使用すると、以下のようなコードが生成されます。
書籍: -
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|---|---|---|---|---|
5350192956 | XSLTプログラマーズリファレンス | マイケル・ケイ | ウロックス | $40 | 第4 |
3741122298 | ヘッドファーストJava | キャシー・シエラ | オライリー | $19 | 第1 |
9987436700 | SQL ザ・コンプリート・リファレンス | ジェームズ・R・グロフ | マグロウヒル | $45 | 三番 |
#その4)結果・出力をWebブラウザで見る
書籍です:
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|---|---|---|---|---|
5350192956 | XSLTプログラマーズリファレンス | マイケル・ケイ | ウロックス | $40 | 第4 |
3741122298 | ヘッドファーストJava | キャシー・シエラ | オライリー | $19 | 第1 |
9987436700 | SQL ザ・コンプリート・リファレンス | ジェームズ・R・グロフ | マグロウヒル | $45 | 三番 |
XSLT要素
上記のXSLTコードとその動作を理解するために、まず、さまざまなXSLT要素とその属性を理解する必要があります。
#1)または
すべての XSLT コードは、次のいずれかのルート要素で開始する必要があります。 または
属性のことです:
- @xmlns:xsl: XSLT 文書を XSLT 標準に接続する。
- versionにしました: パーサに対する XSLT コードのバージョンを定義する。
#2)
この宣言は、ソース文書の選択された入力要素を、出力文書の定義されたターゲット要素ルールに処理または変換するために適用されるルールのセットを定義します。
基本的に、テンプレートはその属性に応じて2種類用意されています:
(i) ネームド・テンプレート xsl:template要素に@name属性が含まれている場合、これをNamed Templateと呼ぶ。
名前付きテンプレートは、xsl:call-template要素によって呼び出される。
(ii) Match Template: xsl:template要素には、入力ノードで適用されるマッチングパターンまたはXPathを含む@match属性が含まれています。
マッチテンプレートは、xsl:apply-template要素で呼び出されます。
xsl:template 要素は、@match 属性または @name 属性のいずれか、あるいは両方を持たなければならない。 match 属性を持たない xsl:template 要素は、mode 属性および priority 属性を持たないものとする。
上記のXSLTを書き換えてみましょう(
a) マッチテンプレートに基づくXSLTコード。 以下の黄色いランプと灰色のハイライトを変更したコードを参照してください、それは同じ上記の出力結果を生成します。
書籍: -
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|
ハイライト部分はスクリーンショットを参照してください:
b) 名前付きテンプレートに基づくXSLTコード。 以下の黄色いランプと灰色のハイライトで変更したコードを参照してください、それは同じ上記の出力結果を生成します。
書籍: -
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|
ハイライト部分はスクリーンショットを参照してください:
#3)
プロセッサーは、@select属性でXPathが定義されているすべてのテンプレートを検索して適用します。
また、@mode属性は、同じ入力内容で複数の出力方法を与えたい場合にも使用します。
#4)
プロセッサは、@name属性に値を持つテンプレートを呼び出します(必須)。
要素は、テンプレートにパラメータを渡すために使用されます。
#5)
上記コードで定義された、@select属性で定義されたXPath式に関する文字列/テキスト値を提供する。
これにより、書籍名の値が表示されます。
#その6):繰り返し
これは、ソートされた順序でノード(@select(必須)属性で定義されたxpath)の各セットに対する命令を処理します。
上記のコードは、各ノードセットのストア/ブック手段を意味する:
/store/book[1]
/store/book[2]
/store/book[3]です。
は、xsl:for-each の子として使用し、並べ替えの順序を定義することもできる。
#その7):条件付き処理
xsl:if 命令は、@test 属性のブール値が真である場合にのみ処理され、そうでない場合は、命令は評価されず、空のシーケンスが返されます。
2">条件真:書籍の数が2冊以上である。
結果です: 条件真:書籍の数が2冊以上である。
ここでは、count()が定義済みの関数である。
#その8):代替条件処理
xsl:chooseは、xsl:when要素の@test属性内でテストされる異なる条件に対して複数の原因を持ち、すべてのxsl:whenの中で最初に真となったテスト条件が最初に処理され、オプションでxls:otherwise要素があり、どの条件テストも真とならなかった場合、このxsl:otherwiseを考慮することになります。
条件成立:本の数が1冊 条件成立:本の数が2冊 条件成立:本の数が3冊 条件が一致しない。
結果です: 条件真:本の枚数が3枚である。
#9)
xsl:copyは文脈の項目、つまりそれがノードであれば、文脈のノードを新しく生成されたノードにコピーし、文脈ノードの子はコピーしない。 このため、これは浅いコピーと呼ばれる。 xsl:copy-of要素とは異なり、xsl:copyには@select属性はない。
以下のコードでは、コンテキスト項目は出力 & にコピーされ、すべての子項目は xsl:apply-template によって再帰的にコピーされた & と呼ばれます。
ノード() 全ノードとその全属性を再帰的に表す。
結果です: これは、ソース文書のすべてのノードと属性を出力文書に再帰的にコピーする、つまり、ソース文書の完全なコピーを作成する。
#10)
xsl:copy-ofは、デフォルトでノードのシーケンスをその子や属性のすべてと一緒に再帰的にコピーします。この性質から、これはディープコピーとも呼ばれます。
結果です: これは、ソース文書のすべてのノードと属性を出力文書に再帰的にコピーする、つまり、ソース文書の完全なコピーを作成する。
現在のノードと現在のアトリビュートのコピーを表す。
#11)
この要素は、対象結果にコメントを書き込むために使用され、このタグを挟んだテキストコンテンツは、コメント付き出力として印刷されます。
これはコメントノードとして出力に出力されます。
結果です:
#12)
これにより、結果文書にテキストノードが生成され、xsl:textの中の値が文字列として出力されることになります。
というものである。
テキスト行です。
出力します:
というものである。
テキスト行です。
#13)
name属性に指定された名前を持つ要素を結果文書に生成します。 name属性は必須属性です。
結果です: 5350192956
#14)
属性名はname属性で定義され、属性値はselect属性で指定したXPathで計算されます。 name属性は必須属性となります。
結果です:
#15)
select属性でノードやXPathを指定し、@order属性でソート方向を指定します。
以下のコードでは、書籍名のアルファベット順に、すべての書籍のリストを取得します。
書籍: -
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|---|---|---|---|---|
このスクリーンショットを参照して、強調表示されている部分を確認してください:
結果です: 以下のリストは、書籍名をアルファベット順(昇順)に並べたものです。
書籍です:
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|---|---|---|---|---|
3741122298 | ヘッドファーストJava | キャシー・シエラ | オライリー | $19 | 第1 |
9987436700 | SQL ザ・コンプリート・リファレンス | ジェームズ・R・グロフ | マグロウヒル | $45 | 三番 |
5350192956 | XSLTプログラマーズリファレンス | マイケル・ケイ | ウロックス | $40 | 第4 |
#16)
この要素は、値を保持する変数を宣言します。 変数は、グローバル変数またはローカル変数です。 変数の名前は、@name属性で定義され、この変数が保持する値は、@select属性で定義されます。
グローバル変数のアクセスはグローバルです。すなわち、変数はどの要素内でも呼び出すことができ、スタイルシート内でアクセス可能なままです。
グローバル変数を定義するには、スタイルシートのルート要素の隣に宣言するだけで、以下のコードで黄色くハイライトされているように、変数「SecondBook」がグローバル変数で、2冊目の本の名前を保持しています。
ローカル変数のアクセスは、それが定義されている要素に局所的です。つまり、その変数は、それが定義されている要素の外ではアクセスすることができません。
グローバル変数とローカル変数のどちらかを呼び出すには、変数名の前にドル記号($)を使用します(以下の黄色で強調表示)。 $ .
ファーストブックネーム:セカンドブックネーム
ハイライトされている部分については、スクリーンショットを参照してください:
結果です:
最初の書籍名:XSLTプログラマーズリファレンス
2冊目の書籍名:Head First Java
#17)
この要素は、キーを宣言するために使用され、その特定のキーにパターン値をマッチさせるために使用されます。
Nameは、@name属性(")でそのキーへのプロバイダです。 ゲットパブリッシャー 「match属性は,XPath式で入力ノードをインデックスするために提供されます(" 書籍 ")のように、以下の黄色でハイライトされた@matchは、ストア内で利用可能なすべての書籍のインデックスに使用されます。
match属性に関連して、@use属性を使用すると、XPath式("publisher")でそのキーの値を取得するノードを宣言することができます。
ここで、「Wrox」という出版社からしか出版されていない本の詳細が必要だとすると、xsl:key要素を使ってキーと値のペアを作れば、その値を簡単に得ることができる。
key('get-publisher', 'Wrox') Key()は2つのパラメータを取ります。1つ目はキーの名前で、この場合は「get-publisher」、2つ目は検索する文字列の値で、この場合は「Wrox」です。
書籍: -
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|---|---|---|---|---|
ハイライトされている部分については、スクリーンショットを参照してください:
結果です:
書籍: -
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|---|---|---|---|---|
5350192956 | XSLTプログラマーズリファレンス | マイケル・ケイ | ウロックス | $40 | 第4 |
結果 / HTML表示:
書籍です:
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|---|---|---|---|---|
5350192956 | XSLTプログラマーズリファレンス | マイケル・ケイ | ウロックス | $40 | 第4 |
#18)
XSLT開発におけるデバッグ用に使用される要素で、アプリケーションの標準出力画面に出力を与える。
terminate属性は、「yes」と「no」の2つの値で使用され、値が「yes」に設定されている場合は、メッセージが実行されるためのテスト条件が満たされた時点でパーサーが直ちに終了する。
このことを理解するために、入力文書でprice要素が誤って空になってしまった場合を考えてみましょう。
デバッガーアラートは、アプリケーションの標準画面で表示されます: 21行目のxsl:messageで処理が終了しました。
XMLコードを入力します:
SQL The Complete Reference James R. Groff McGraw-Hill 3rd
ハイライト部分はスクリーンショットを参照してください:
XSLTのコードです:
書籍: -
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|---|---|---|---|---|
ハイライト部分はスクリーンショットを参照してください:
結果です: なお、パーサが空の値札を見つけると、すぐに処理を終了してしまう。
書籍: -
ブックID | 書籍名 | 著者名 | 出版社 | 価格 | エディション |
---|---|---|---|---|---|
5350192956 | XSLTプログラマーズリファレンス | マイケル・ケイ | ウロックス | $40 | 第4 |
3741122298 | ヘッドファーストJava | キャシー・シエラ | オライリー | $19 | 第1 |
ハイライト部分はスクリーンショットを参照してください:
#19位)&;
この要素は,テンプレートの内部で定義されている場合,そのテンプレートのパラメータを定義します. グローバルパラメータとして内部で定義することも,ローカルパラメータとして内部で定義することも可能です.
の値は、テンプレートが呼び出されたときに渡される/供給される。 または .
の中で定義されたパラメータの値を渡します。 name属性には、要素の@name属性と一致するパラメータ名を指定し、@Select属性には、そのパラメータに値を設定します。
パラメータの値を取り出すには、変数と同じようにドル記号($)を使用します。
ソースXMLコードです:
XSLT Programmer's Reference Michael Kay Wrox $40 4th Head First Java Kathy Sierra O'reilly $19 1st SQL The Complete Reference James R. Groff McGraw-Hill $45 3rd
XSLTのコードです:
書籍リスト 名前 :-)
書籍名です:
ハイライト部分のスクリーンショットを参照してください:
結果出力:
書籍リスト 名前 :-)
書籍名:XSLTプログラマーズリファレンス
書籍名:Head First Java
書籍名:SQLザ・コンプリート・リファレンス
#20)
は、現在のスタイルシートの中に別のスタイルシートモジュールをインポートするために使用されます。 これは、モジュール式のXSLT開発アプローチの実現に役立ちます。
インポート後、すべてのテンプレートが使用可能になりますが、インポートしたスタイルシート(親スタイルシートがインポートしたもの)よりも、インポートしたスタイルシート(他のスタイルシートをインポートしたもの)で定義されているテンプレートの優先順位が高くなります。
他のスタイルシートが、インポートするテンプレート内で定義されたものと同じ名前のテンプレートを持つ場合、海外のテンプレートは自分のテンプレートで上書きされます。
属性@hrefは、インポートしたいスタイルシートのURIとして使用します。
#21)
上記のxsl:importと同様に、モジュール化されたXSLT開発アプローチの実現にも役立ちます。 xsl:importによって含まれるすべてのテンプレートは、呼び出し元のスタイルシートと同じ優先順位/優先順位を持ちます。 これは、別のスタイルシートから自分のスタイルシートにすべてのテンプレートをコピーするようなものです。
属性@hrefは、インポートしたいスタイルシートのURIとして使用します。
#22)
この要素は、出力ファイルの結果ツリーを指定するためのもので、@methodなどの属性があり、'XML', 'HTML', 'XHTML', 'text'などの値を持つが、デフォルトは 'XML' だ。
XMLやXHTMLのデフォルト値はUTF-8またはUTF-16である。
#23)
この要素は、@element属性内にリストされたソース要素に対して、重要でない空白を除去するために使用されます。すべての要素から空白を除去したい場合は、@elements属性内に'*'を使用します。
#24)
この要素は、@element属性内にリストされたソース要素の空白を保持するために使用され、すべての要素から空白を保持したい場合は、@elements属性内に'*'を使用します。
結論
今回は、XSLTについて、よく使われるXSLTの要素、ソースコードとターゲットコード、ソース要素からターゲット要素への変換について説明しました。
また、XSLT変換コードを開発するためのXPathの重要性についても説明しました。 XSLテンプレートの宣言とテンプレートの呼び出し& パラメータの受け渡しを見ました。 グローバル変数とローカル変数の宣言、XSLTコードでの使い方、呼び出し方法について学びました。
xsl:if、xsl:for-each、xsl:chooseといった分岐や条件付きのXSLT要素について学び、浅いコピーと深いコピーの違い、ノードの並び替え、xsl:messageによるXSLTコードのデバッグ、名前付きテンプレートとマッチテンプレートの違い、xsl:outputによる出力書式について理解することができました。
著者について : Himanshu P.は情報技術分野の経験豊富なプロフェッショナルです。 ITC MNCでクロスビジネスドメインや複数のテクノロジーに携わってきました。 Himanshuの趣味は雑誌を読むこととブログを書くことです。