Mozilla の disable-output-escaping
どうやら 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 の力を借りて何とか回避することはできた。
一度 HIDDEN 型の <INPUT> 要素値として出力した後、表示位置の innerHTML に設定してやれば、disable-output-escaping="yes" にした場合と同じ出力結果を得ることができる。
<input type="hidden" id="foo" value="{/search-engine}" /> |
あまりスマートではないが、XSL をサポートしてるブラウザなら Mozilla 以外でも意図した通りに動いてくれるだろう。しかし XSL の Content-Type の件やら見てると、あぐらかいて作り込みが甘い体質は相変わらずのようだ。