Chromeでの実行方法 コマンドライン引数に --allow-file-access-from-filesをつけるとローカルのファイルにアクセス可能になる。 今回のサンプルはXSLT1.0の機能のみを使用している。 ファイル index.xml テンプレートの取り込みと表示の条件(データファイル名) template.xsl XSLテンプレートファイル data.xml データファイル 説明 index.xmlは表示の条件を記述。 Root@langは言語切替(ja or en) index.xmlにtemplate.xslを適用。 template.xslの説明 template.xslの12行めでindex.xmlのDataFileノードで指定されたファイルよりデータのノード取得。 18行目以降はデータファイル(data.xml)に対する整形ルールとなっている。 18行目 から始まるテンプレートは HTMLの基本的な構造を出力。38行目はItemsノードを指定してテンプレートを適用(Titleノードは含まない)。 45行目からはItemsノード用のテンプレート。 50、53行目の条件分岐はわざと変数を分けてある($lang_localはテンプレートに渡された引数、$_langは先頭のほうで宣言した変数)。 59行目から66行目はループ処理。64行目はテンプレート呼び出し。Applyではなく、Callに注目。 Applyはselectにより、カレントを移動(任意のノードに移動)できるが、 Callの場合、カレントを移動できない(任意のノードは渡せない)。ここではカレントはItem。 ちなみに60行目で、price属性でソートを実行。 97行目はXSL関数(format-number)3桁区切り表示にしている。また、$_taxと掛け算も実施。 JavaやC等の「命令型」プログラミングと違い、XSLは「宣言型・関数型」なプログラムであることに注意。 関数型は「副作用がない」事が原則なので、入力に何かしらの変化を与えて以降の処理が影響されることはない。 関数型にはJavaのScalaやHaskellというものがある。(SQLもある意味関数型的) ※変数の再代入ができないのでXSLはループのカウンタをインクリメントできない。 →この場合再帰処理でテンプレート引数を増やす様にする。 何に使おう 前述のとおり、XSLだけでシステムを組むことは困難(できないことはない)な為、他の言語(Java、.net等)で、 XMLデータをXSLテンプレートに合わせて生成→Xalan等のXSLTプロセッサでHTML変換を行うのが有効か。 1.CMSで動的なページを作成している場合。 大規模(膨大なトランザクション量)のシステムの場合、リクエスト毎にページを生成するのは非常に負荷がかかるため、 XSLTで予めHTMLを出力しておきそれを参照させる方法が有用である。 変換は夜間のバッチや変更されたタイミング等に行う。 ただしリアルタイム性が必要なサイトには適用できない。 2.極端に制約が多い(Webサーバー、DBサーバーを入れられない)が、ブラウザ(HTML)でページを表示したい。 HTMLエディタですべてのページを作る方法もあるが、XMLデータとして決まった書式のデータのみ作成してもらい、 それをブラウザ(IEやChromeにはXSLTプロセッサ機能がある)で変換&表示を行う。 ローカルファイルの場合、ブラウザのセキュリティで制限されている場合もあるので注意が必要。 3.Amazon WebサービスではXSLTプロセッサを提供している。(結構昔から) なお、変換先はHTMLに限らない。CSV、LaTexでの出力も可能(テキストならなんでも可能)