IE 5.XのXSLTで生成したファイルが文字化けする | |
IE 5.0/5.5とMSXML4を利用して、XSLTで生成したHTMLに日本語を含むURIを入れようとすると、文字化けしてしまいます。解決方法を教えてください。 |
回答/富士ソフトABC株式会社 技術センター
2001/12/7
まず、この問題をできるだけ小さいファイルで再現できるようにしたのが下記のリスト1とリスト2です。ご質問にあるように、この2つを組み合わせて実行すると、HTML文書として生成されるアンカーの参照先が文字化けしてしまいます。
<?xml version="1.0" encoding="UTF-8"?> |
リスト1 実際にはUTF-8のファイル(Test.xml)。 |
<?xml version="1.0" encoding="UTF-8"?> |
リスト2 実際にはUTF-8のファイル(Test.xsl)。 |
ご質問のポイントを絞ってみると、上記のリスト1のXML文書を、リスト2のXSLTで変換すると、以下の変換結果が出力されることを期待しているはずです。
<a href="#漢字">あああ</a><br /> |
しかしこのHTML文書をHTML 4.01の勧告に厳密に従って記述すると次のようになり、意図したとおりの結果とはなりません。
<a href="#%E6%BC%A2%E5%AD%97">あああ</a><br
/> |
なぜ漢字が文字コードになってしまうかというと、HTMLにはアンカータグの「href」アトリビュートを記述するときに、「URIの値が非ASCII文字だった場合エスケープすべきである」という決まりがあるからです。W3C勧告「HTML 4.01 Specification」のB.2.1 Non-ASCII characters in URI attribute valuesに記述があります。
しかしXSLTに限れば、ご質問にあるような考え方、つまり漢字での出力を期待することは、決して誤りではありません。試しに下記にあるように、アンカータグをイメージタグに、hrefアトリビュートをaltアトリビュートに置き換えて確認してみてください。きちんと非ASCII文字列「#漢字」が格納されていることが分かります。
<a> |
このことからも、MSXMLがXSLTの勧告に従って厳格に実装されていることが分かります。
つまり今回の回答は、「この動作はHTMLの仕様です」となるのですが、実際には簡単な解決策があります。それを紹介します。xsl:outputのmethodをhtmlからxmlに変更すればいいのです。
<xsl:output indent="yes" method="html"
encoding="UTF-8"/> |
XMLでは「アンカータグのhrefアトリビュートが特殊である」ことはまったく関係ありませんので、上記のように書き換えて処理すれば、きちんと意図したとおりの結果を得ることができます。
この変換結果を、XHTMLと仮定してXSLTスタイルシートを記述すればHTMLとの食い違いも少ないので、xsl:output の method を変更したことによる問題も発生しないはずです。
■関連記事
XSLTスタイルシート書き方講座 (1) XSLTスタイルシートの基礎の基礎
サンプルで覚えるXSLTプログラミング
「Ask XML Expert」 |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|