2006-05-07 [長年日記]

xsltprocで日本語のHTMLを処理する

xsltprocのオプションに--htmlを渡すと入力をHTMLパーサが処理してくれますが、このときの文字コードはiso-8859-1として扱うようです*1。なので、そのまま処理すると文字化けしてしまいます。

そこでまず以下のようなテンプレートを用意します(ここでは、identity.xslというファイル名にしました)。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:output method="xml" encoding="iso-8859-1"/>
  <xsl:template match="*|@*">
    <xsl:copy>
      <xsl:apply-templates select="*|text()|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

これでひとまず、HTMLをXMLに変換します。HTMLのコメントにはXMLのコメントとして不正なものが含まれていることが多い*2ので、コメントは落としてしまったほうが良いです。

内容はこれで正しく出力されますが、XML宣言のエンコーディングがiso-8859-1になってしまうので、sedで置換します。その後、目的のスタイルシートを適用します。たとえば、以下のようにします。

xsltproc --html identity.xsl http://www.example.org/sample.html | sed -e 's/iso-8859-1/euc-jp/' | xsltproc test.xsl -

この例では、元のHTMLのエンコーディングがEUC-JPで、目的のスタイルシートがtest.xslです。

*1  サーバ側がContent-Typeにcharsetを付けていると違うのかも知れません

*2  具体的には--が含まれていることが多いです。しかも、xsltprocはXMLにするときにそのまま出力してしまいます

[]