XML, XSLT
「ローマコイン」のページを作るのに XML, XSLT, Sablotron, PHP を使っています。
なぜ XML を使ったのか
ローマコインのページでは沢山のローマ皇帝たちを扱っています。各ページにはコインの画像があり、その拡大画像へのリンクなども張っています。また、各皇帝へのインデックスも必要です。また、説明文はともかく主な内容については英語版のページも作りたいと思っていました。
当然、HTMLだけで書けますが、次のような問題点があります。
- リンクなどのデータの管理がとても面倒。皇帝を1人増やしただけで変更箇所はかなり多い。
- 同じデータを何度も入力しなければならないので無駄が多い。
- 同種のページは同じデザインで作りたいが、デザインを一定にするにも苦労が絶えない。
それに対して XML でデータを書くことにすれば、
- データはXML、デザインはXSLという「データとデザインの分離」ができる。これにより、統一したデザインのページを作ることが容易。また100ページ以上もあるコインのページのデザインを一斉に変更することも容易になる。
- 一カ所入力したデータを他の箇所で使いまわすことができる。だから、同じデータを複数回入力する無駄が無くなる。
- 自分でわかりやすいタグを定義して使えるので、メンテナンスが楽。
だから、ページ数が増えるほどメリットは大きく感じられる。
どこでHTMLに変換するか
XMLをHTMLに変換しなければブラウザでの表示に困るわけだが、どこで変換すれば良いだろうか。これには3通りの方法が考えられると思う。
1. クライアントサイドで変換する。
IE の 5.0 以上であれば、XMLとXSLのファイルをサーバ上においておくことにより、ブラウザで HTML に直して表示させることが出来る。
Java Script と DOM を使っていろいろ複雑なこともさせることが出来る。
しかし、この方法には「ブラウザ依存」という大きな弱点がある。IE以外では表示できないし、IEであっても使っているのがMSXML3.0なのか4.0なのかで表示が異なってしまう。
IEのシェアは大きいとはいえ、「ブラウザ依存」はなるべくしない方が良いだろう。
2. サーバサイドで変換する。
これが最もXMLのメリットを引き出す方法だと思う。
サーバ側でHTMLに変換してやれば、クライアントのブラウザには依存しない。状況に応じて動的にページを作ってやることも可能。また、アップロードするファイルの数も少なくて済み、管理も楽だろう。
ただし、サーバに負荷がかかりすぎて遅くなることもあるかもしれないし、サーバ側に変換するための仕組みを用意できない環境では使えない。
3. 先にHTMLに変換してからサーバにアップロードする。
サーバ側での変換が出来ない環境ならば、サーバにアップロードする前にHTMLに変換しておくという手もある。
本サイトは 2002/8/12 まではこの方法を使っていた。
(以前の方法)
サーバサイドでXMLをHTMLに変換しよう
サーバサイドでXMLをHTMLに変換するときに使える変換エンジン(XSLT processor)にはいろいろなものがある。Windows のサーバで IIS を使っているのなら msxslが便利だろう。
他には SAXON, XT, Xalan などがある。
本サイトで使っているのが
Sablotron
というもので
PHP から呼び出して使っている。
なぜ、Sablotron かと言うと理由は単純で、私が借りているサーバにインストールされているからである。(^^)
以下に Sablotron を呼び出すPHPスクリプトの例を挙げる。(エラーチェックなど省略しているのでそのままでは使えません。^^;)
<?
$xslData="aaa.xsl"; // スタイルシートの指定
$xmlData="bbb.xml"; // XMLの指定
$arg=array();
$param=array("param1"=>"value1"); // パラメータの指定
// 上の様にパラメータを指定するとスタイルシート内で <xsl:param name="param1"/> として参照することができる。
$xh=xslt_create();
$result=xslt_process($xh,$xml,$xsl,NULL,$arg,$param);
print $result;
xslt_free($xh);
?>
本サイトでの実際
本サイトで /coin/ZZ_default_j_trianus.html へアクセスしようとすると、
.htaccess の設定により、
/coin/_coin.php?sort=default&lang=j&p=trianus に Redirect される。
_coin.php は スタイルシート _coin_single.xsl を用いて、個別の皇帝のXMLファイルZZ_xml_trianus.xml を変換する。そのとき、sort=default, lang=j というふうに
パラメータを渡す。
個別の皇帝のXMLファイルを作るには2段階の変換を行っている。
まず、coin.xml(皇帝たちのXMLファイル)、moneta.xml(コインのデータのXMLファイル)をエディターやコインのデータベースを使って作っている。
次に、これらを スタイルシート merge.xsl を使って、データをまとめた merge.xml に変換する。
さらに、perl を使ってパラメータを変えながら スタイルシート to_single.xsl を使って、 merge.xml から 個別の皇帝のXMLファイルを作っている。
この作業は perl のスクリプトを使っているのでワンクリックでOKになっている。なお、内容が変化しなかったファイルのタイムスタンプはそのままになるよう工夫している。
いろいろ