¿Cómo puedo hacer que XSLT devuelva UTF-8 en Java?
Estoy tratando de hacer que mi script XSL funcione con la codificación UTF-8. Los personajes como åäö y los caracteres griegos simplemente aparecen como basura. La única forma de hacerlo funcionar es si escribo el resultado en un archivo. Si lo escribo en una secuencia de salida, solo devuelve basura (System.out funciona, pero eso podría deberse a que se está redirigiendo a un archivo).
El resultado debe devolverse desde un servlet, y tenga en cuenta que no es un problema de configuración del servlet. Puedo devolver una cadena codificada con caracteres griegos desde el servlet y funciona bien, así que es un problema con la transformación.
Aquí está mi código actual (simplificado).
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();
}
}
Además, mi script XSL contiene lo siguiente
<xsl:output method="html" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
¿Cuál es la forma correcta de hacer que esto funcione? Estoy usando Saxon para la transformación si eso podría ser de alguna ayuda.