XSLT:XSLTってなに?

XSLTを始めよう!

 しょーじき、XSLTって盛んに使われている印象はないし、使っている自分も激しく便利!、という感想も持ってないのですが(笑)、備忘録的に書いていきます。
 もうXSLTを始める他ないって人以外、読まない方がいいかもしんない(笑)
 少なくともXMLを知ってないと話にならないので、基本的なXMLを身につけてから読みましょう。

 XSLTが出始めた頃は、いろいろなスクリプト言語(PerlやRubyやPythonやPHP)のXMLパーサがイマイチ整ってなかったんですが、いまはどの言語も大抵しっかりしたのが備わっているので、それぞれのスクリプト言語で変換してやればよく、XSLTをあえて使う理由がないように思えます。
 jQueryやNode.jsなどのライブラリや実行環境の整備がされているので、JavaScriptだけでも、いろいろXMLいじりできます。
 しかもJavaScriptだとリアルタイムに変更できますからねー、XSLTの変換は静的なものですし。
 …いよいよ、XSLTを習得する意味がよくわかんなくなってきたな(笑)

 えーと…、XSLTを始めなくてもいいです!

XSLTってなに?

 XSLTはXML Stylesheet Language Transformationの略で、XMLで書かれた情報変換用のスタイルシート、ってことですかね。
 私は、XMLデータのフィルタと理解してます。
 入力したXMLデータを加工して、別のテキストフォーマットとして出力するための手順書、といいますか。

 スタイルシートというとCSSを思い浮かべると思いますが、ほとんど全然別物です。
 でも意外に現行のブラウザのほとんどで動作して、XMLをHTMLに加工して出力することができたりします。

 プログラミング言語としての性質も持っていて、基本的な制御構造を持っています。
 その構造は関数単位で、関数型プログラミング言語に分類されたりしますが、あんまりその辺気にしなくていいんじゃないかと思います。
 フィルタです、フィルタ。XML用の正規表現みたいなもんです(雑)

ブラウザで表示

 まず、処理の元になるXMLデータを作ります。
 と言っても何のデータもないルート要素のみの最低限のファイルです。sample01_01.xmlとでも名前をつけて保存します。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="sample01_01.xslt"?>
<root/>

 ここで大事なのは2行目のxml-stylesheetの記述です。このXML文書を次に指定する(href)のスタイルシートで変換しますよ、って宣言です。
 これを書くことで、XMLをブラウザで表示する際にXSLT変換を行ってくれます。
 もちろんhrefで書いたところ(この場合同じフォルダ)にXSLTファイルを置いておく必要があります。

 さて変換を行うXSLTファイルは以下のように書きます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
	<html>
	<head><title>XSLTテスト</title></head>
	<body>
	<h1>サンプル</h1>
	<p>文章</p>
	</body>
	</html>
</xsl:template>
</xsl:stylesheet>

 1行目はXMLでおなじみの宣言、xsltの要素は2行目からでxsl:stylesheetは全体の設定なんかをするルート要素。
 XMLを理解していればxsl:の部分は名前空間用プリフィックスなので、別にxsl:である必要はないというのはわかると思いますが、今後も特に理由がない限りxsl:で書きます。
 あと、途中でHTMLのタグも出現しているんで、ここでxmlns="http://www.w3.org/1999/xhtml"しておいた方が行儀がいいのですが、まぁそこはそれ、最初のあたりは細かい部分省略で動けばいいやの方向で。
 ネームスペースについては、ちゃんと理解してないと、意外なところで不必要なネームスペース宣言がくっついてきちゃったりするので、 XML全般で重要ですがXSLTでは特に重要です。

 で本体は3行目のxsl:templateから始まります。
 matchで設定した要素に遭遇した時にブロック内の処理を実行するという要素です。
 ここでは/が書かれていますが、これはルート要素を示しています。

 XSLTはxml:のネームスペース以外の内容をそのまま出力します(正確に言うと違いますが)
 このサンプルの場合は<html>から始まって、</html>で終わる部分をそのまま出力します、見れば分かる通りHTMLをそのまま書いているだけです。

 最初に作ったXMLでsample01_01.xsltと指定しているので、そういう名前をつけてxmlと同じフォルダに保存します。
 ちなみにXSLTファイルの拡張子はxslでもいいですが、Excel書類の.xlsと似過ぎていて紛らわしいので、.xsltを使っていきます。それ以上の深い意味はないです。
 そして、適当なブラウザにXMLファイルを読み込ませればXSLTが適用されて、変換後のHTMLがレンダリングされ表示されます。
 変換後といっても今回は何の変換も行っていませんが、通常は元ファイルのXMLデータを元にXSLTによって加工された結果のHTMLを出力します。

 ところで私、実際ウェブ上でXSLT変換を行っているXMLファイルが実用的に使われてるの見たことないんですが、皆さんあります? URLの末尾のファイルが拡張子.xmlなんだけどブラウザに表示されているのは、普通のページってやつ。
 私はXSLTの入門とかチュートリアルのページでしか見たことないんですけど……。
 ブラウザでXSLTを動かすと、XSLTの動作チェックと、HTMLのレンダリングのチェックがブラウザ毎に必要なので、あんまり現実的じゃないのかもしれません。
 そこそこXSLTの動作は安定しているみたいですけど、私も含めて使っている人がいないので、実際の使い勝手は良く分かりません。

 ブラウザでの表示に関しては、HTML 用のスタイルシートとして XSLT を使用するってIBMの記事がわりといいかも。

コマンドラインで変換

 ブラウザであんまり使われてないのなら、どこで使われているのでしょう。
 正直、実際使われている場面を自分が使っているところ以外で見たことがないので、どこにも使われていないということもありえますが(笑)、W3Cは仕様のアップデートもしてますし、どっかで使われているんでしょう。
 さて、私の場合はshellコマンドを使ってXML(XHTML)から別のXHTMLを出力するという使い方をしています。

 以前はAppleScript用のXSLT機能拡張があって、それを使ってたんですが、OS Xのバージョンアップに伴い動かなくなっちゃいました。
 それでxalanというコマンドラインツールを使ってたんですが、コマンド自体もインストールの必要がありますが、Javaで動いているのでJava環境も整えねばならず、あんまり人に勧められるもんでもないな、と。
 で、たぶんOS X の10.9あたりからxsltprocというコマンドが最初から入ってるみたいなんで、これ使ってます。
 そこそこ速度もありますが、現状XSLTのバージョン1.0しか使えないみたいなのが残念なところです。
 2007年にはXSLT2.0の仕様も固まって、現在は既に3.0の仕様の策定も進んでいる(Working Draft)というのに…。
 ま、機能がたくさんあっても使い切れませんからね。それに今現在ブラウザが対応してるの大抵1.0だし! でも、2.0だと日付とか使えて便利なのよねぇ…

 ところで、XSLT使っている人はどのエディタで書いてるんでしょうか? <oXygen/>とか使ってるんですかね?
 私はmiというエディタに自前のXSLTモードを作って書いているんですが、世の中にはもっと便利な環境がありそうです。
 XSLTファイルを作るたびに書き方を忘れてしまうぐらいXSLTを書く機会が少ない(作ったXSLTファイル自体は毎日使っています)私は、エディタにこだわる段階でもないんですが。

 さてさて閑話休題、xsltprocです。
 だいたい以下のような感じで使います。-oオプションで出力ファイルを指定して、続けてXSLTファイル、入力ファイルという形です。

xsltproc -o "output.html" "sample01_01.xslt"  "sample01_01.xml"

 この場合、コマンドラインでXSLTファイルを指定していますので、入力ファイルのXMLにはXSLTファイルの宣言行は不要です。
 もちろん、-oを使わず普通に>を使ってリダイレクションで出力してもいいです。

 あとは、AppleScriptからdo shell scriptで呼び出すもよし、automatorのスクリプトを作るもよし、もちろんターミナルのコマンドラインで使うもよしです。

 ちなみにXSLTにXMLファイルやXSLTファイルをインポートする仕組みが用意されているので、元データとなるXMLファイルや加工に使うXSLTファイルは複数を組み合わせることもできます。
 この辺ちょっと夢が広がりますが、できて当たり前と言われると、できて当たり前ですよね、って感じでもあります。

参考資料はどこに

 インターネットを検索すると、色々とXSLTに関する情報が見つかると思いますし、おそらくこのサイトも検索で見つけられたことと思います。
 しょーじき、私は今ひとつ良くわかってないんで、早々と別のサイトに乗り換えた方がいいかもしれません。
 以下を参照すればだいたいわかるんじゃないでしょーか。

 私は、全部読んだはずなんですが、読んだ端から忘れています(笑) 使わないと忘れるわ〜。
 あまりにもひどいので、一度自分でまとめておこうというのがこのページです。
 誰かに向けて発信している意図は、ほとんどありません。最初に書いたように自分の忘備録。
 公開しているのは、「公開することを決めていると、それなりにちゃんと書く」からで、自分に対しての奮発材料程度のものです。
 サイトにアップしておくと別の端末でも見れるしね。
 少なくとも私個人には役だつ資料のはずなので、今これを読んでいるあなたにも、たまたま役立っちゃうかもしれません。

 書籍に関しては、日本語の本については2003年ぐらいにぽこぽこと出て以降、ほとんど出てないんじゃないかな。
 上記サイトにしてもその頃作られて、今も継続して公開されているというところが多い気がする。
 残念ながら書籍には頼れないのが現在の状況です。
 英語圏も視野に入れれば、ちょこちょことは出てます。

 今日はここまで。