NDoc メンバ情報部分の文字化け

先日の日記で言及したとおり、.NET2.0上でNDocの最新ソースをビルドに成功、実際にMSDN形式ドキュメントを出力する事は出来たが、型のメンバ情報を出力する際に文字化けが発生していたことを書いた。

本日、この件に関して、だいぼうさんよりコメントを頂いた。(感謝!!)

スペースが ? になってしまう問題は,NDoc日本語版の MsdnDocumenter.cs もしくは Msdn2Documenter.cs 内の TransformAndWriteResult 関数に修正が必要みたいです。
どちらも1700行目あたりの
Cannot convert to Shift_JIS code!!!!
のところが肝みたいです。
[だいぼうさんのコメントより引用]

おお、と思いソースコードを見てみたが、私が持っているソースコードはJonas lagerblad氏が改変した版であり、該当の箇所は無かった。そこで、だいぼうさんのコメントにある通り、日本語版のソースを見てみると、しっかりこう書かれていた。

// 
// Cannot convert   to Shift_JIS code!!!!
// 
string html = stringWriter.ToString().Replace("\xA0", " ");
[NDoc日本語版 v1.3.1-rev1 MsdnDocumenter.csより引用]

"\xA0"を" "に変換しているのか。何故こんなことをしているのだろう、と少し考えていたのだが、すぐに納得した。NDocはドキュメントのフォーマットによっては生成したXMLXSLTによりスタイルシート変換しているのだが、該当のMSDN形式ドキュメントで使用するXSLスタイルシートを見てみると、いたる所で以下のような記述があったのだ。

<div class="syntax">
    <span class="lang">[Visual&#160;Basic]</span>
    <br />
    <xsl:call-template name="vb-property-syntax" />
</div>

問題は、"&#160;"で書かれているノーブレイクスペースの文字実体参照。どうやらこいつから変換された文字コードShift_JIS環境だと全て文字化けしてしまうようである。むろん、引用したコードの通り、コード単位で変換しても良いが、せっかくXSLTを使用しているのだから、Shift_JIS環境用のXSLを用意してやれば解決すると思ったのだが、そう甘くはなかった。

試してみたこと

  • "&#160;"を"&nbsp;"に変換する

× XSLTでは"&nbsp;"のような実体参照を認識しない。

  •  '>を使う

× "&nbsp;"がそのまま使えないのであれば、XSLのdisable-output-escaping要素を使えば通ると思ったのだが、効果無し。

  • を使う

× method="html"に対応しているプロセサであれば"&#160;"は化けないということを仕入れてきたのだが、これも効果無し


と、XSLTで"&nbsp;"を扱う常識が全く効かないのである。 文字列のレベルで置換をしているコードに改めて納得したのだが、本当にこの方法しか無いのだろうか。