Опитвам се да накарам моя 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 за трансформацията, ако това може да е от полза.