どうやら Mozilla 系 (Firefox, Netscape) のブラウザは <xsl:value-of> の disable-output-escaping 属性を無視するらしい。
XML に記述されている & や < などの文字は XSL の出力方法に適切な形式でエスケープされるのだが、この属性を "yes" に設定することでこの動作を解除する事が出来る。つまり XML に埋め込んだ HTML タグがそのまま利くようになるわけだ。
<?xml version="1.0"?> |
上記のような XML に対して:
<xsl:value-of select="/search-engine" disable-output-escaping="yes" /> |
という記述は Google へのリンクを生成する (もし no にすれば <a href=... という文字がそのまま画面に表示される)。
ほとんどの XSL 対応ブラウザがこの挙動を踏襲しているにもかかわらず、Mozilla は no にした場合と同じ動作になる。しかも Mozilla 開発者によれば W3C 仕様のもにゃもにゃに準拠しているのでバグではない、将来的にも対応する予定も無い、解釈の違いだ、との事だ。
何じゃそりゃ。W3C の仕様にこの属性はちゃんと盛り込まれている。出力結果に非 Valid HTML が混ざるのに現行の設計が対応しておらず、2 重になってるパーサの実行コストにも跳ねるのですぐには対応できない、手を入れたくないというのが実際の本音のようだ。
とりあえず、この問題は JavaScript の力を借りて何とか回避することはできた。
Mozilla Firefox 1.0.7 (Linux) で XML + XSL を表示させてみたところ
Error loading stylesheet: (null)
http://servername/stylesheet.xsl
などと表示されてしまった。一応 XSLT の処理までは行っているようだが、はてさて原因メッセージが null じゃどこが悪いのか皆目見当も付かず…
試行錯誤の末、どうやら XSL ファイルに対してサーバが返す Content-Type を text/xml にしてやらなきゃダメらしいということまで分かった。text/xsl でもダメなのである。なんとも息苦しい挙動である。
しかもサーバ側で XSLT 処理して HTML 落としてた時と比べて微妙に挙動が違うじゃん! 今までは JavaScript で documet.all("id") とやっていても JavaScript コンソールに警告が出る程度だったのに、何か全面的に禁止になってるみたいだ。うーん、変更の本質でない部分で挙動変わると何か先行き不安だす (´・ω・`)
XSL を使って XML を処理するケースについて。
XML をストリームで生成する場合、XSLT が逐次処理を行ってくれると省コストで高パフォーマンスが得られて重宝するだろう。つまり XSLT が FilterWriter がごとく機能し、そこに XML を出力して行けば下層ストリームに変換結果が出力されるという設計だ。
だがコアライブラリの javax.xml.transform ライブラリはそうなっていない。DOM または入力ストリームのみを Source として受け付けており、これは最初に完成された XML ありき、という事を意味している。
果たして逐次処理は出来ないのか? という事で XML 生成処理を別スレッド化し、ストリームを PipedReader/PipedWriter で繋げて XSLT を実行してみたところ、やはり XML の生成が完了するまで XSLT の出力は開始しないようだ。
そもそも逐次処理は可能なのだろうか? あれこれ考えてみた。XSL の XPath には特定の位置の要素を指したり、count() などで要素数を得るような処理が記述できる。そういった処理が含まれる以上、結局どこかで完成した DOM が必要ということになり、変換処理を逐次で行うのは現実的でないという事なのだろう。
やはりデータ量が多くなればなるほど XML は不利っぷりはひどいな。残念無念。
Microsoft Internet Explorer は 5.0 から XML + XSL での表示をサポートしている。動的なデータは XML で、静的なレイアウトは XSL でと分離が出来るので、サーバの処理コストと通信負荷を押さえたりクライアントアプリケーション (非ブラウザ) との統合を図ったり、また、いざという時はサーバ側で XSLT を動かしたりも出来るので個人的には気に入っている構成なのだ。
ただ、この方式は XSLT プロセッサがブラウザの中に隠蔽されているので開発時には少々不便でもある。XML + XSL でどういう HTML が生成されたか、開発者は見ることが出来ないわけだ。そこでこのプラグインの紹介。
上記は IE 上での XSLT 処理結果を表示出来るようにするプラグインだ。ダウンロードしたファイルを実行して全てのブラウザを開きなおせば、コンテキストメニュー (ページ上での右クリック) に 「Validate XML」 と 「View XSL Output」 の 2 つのメニューが追加されているだろう。これで名前の通り XML の検証と XSL 出力表示を行うことが出来る。
※うまく行かないときはインストールディレクトリの 2 つの *.inf ファイルを右クリックしてインストールする。
XML 内で外部 XSL スタイルシートの指定の仕方をいつも忘れてしまうのでメモっておく。
<?xml version="1.0"?> |
<?xml-stylesheet?>
の宣言と <xsl:stylesheet>
の部分がどいつも頭の中で混乱する。
<?xml version="1.0"?> |