XSL スクリプトを UTF-8 エンコーディングで動作させようとしています。åäö やギリシャ文字などの文字はゴミのように出てきます。それを機能させる唯一の方法は、結果をファイルに書き込むことです。出力ストリームに書き込むと、ガベージのみが返されます (System.out は機能しますが、ファイルにリダイレクトされたことが原因である可能性があります)。
結果はサーブレットから返される必要があります。これはサーブレットの構成の問題ではないことに注意してください。サーブレットからギリシャ文字でハードコーディングされた文字列を返すことができ、それは正常に機能するため、変換の問題です。
これが私の現在の(簡略化された)コードです。
protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,
IOException {
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
final TransformerFactory factory = this.getFactory();
final File inFile = new File("infile.xml");
final File xslFile = new File("template.xsl");
final File outFile = new File("outfile.html");
final Templates templates = factory.newTemplates(new StreamSource(xslFile));
final Transformer transformer = templates.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
final InputStream in = new FileInputStream(inFile);
final StreamSource source = new StreamSource(in);
final StreamResult result1 = new StreamResult(outFile);
final StreamResult result2 = new StreamResult(System.out);
final ByteArrayOutputStream out = new ByteArrayOutputStream();
final StreamResult result3 = new StreamResult(out);
//transformer.transform(source, result1);
//transformer.transform(source, result2);
transformer.transform(source, result3);
final Writer writer = response.getWriter();
writer.write(new String(out.toByteArray()));
writer.close();
in.close();
} catch (final TransformerConfigurationException e) {
e.printStackTrace();
} catch (final TransformerException e) {
e.printStackTrace();
}
}
また、私の XSL スクリプトには次のものが含まれています。
<xsl:output method="html" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
これを機能させる正しい方法は何ですか? それが役立つかもしれない場合、私は変換にSaxonを使用しています。