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です。