我甚至不确定如何提出这个问题,但是: 我有两台服务器,一台是运行Ubuntu 13.10的Linux VM,另一台是Windows 7。 我在两者上运行Apache Tomcat 7.0.42。 我在两者上运行Java 1.8.0_66。 我已经将一个应用程序构建为.war文件,并在两个Tomcats中部署了相同的.war文件。 此war文件读取xml文件并使用xsl文件对它们执行转换。我在两个安装中使用与输入完全相同的文件 - 所有文件都放在Tomcat环境中相同的文件夹结构中。
问题:每台计算机上生成的转换文件不同。两个生成的版本都是格式良好的,但它们包含不同的内容。并没有太大的不同,但其中一个(在Linux上生成的一个)中有额外的元素而不是Windows。
考虑到安装和数据源是否相同,有没有人对这种不同行为的来源有什么建议?
有一点需要注意:在Windows上运行的.war生成的结果是预期的结果。
以下是执行转换的方法,并在Windows v.Linux中提供不同的结果(使用相同的文件。)
// Performs an XSLT transformation on the source stream using the transform stream and writes the result to
// an output file stream.
//
protected OutputStream performTransform(InputStream source, InputStream transform, OutputStream outputFile) {
// Force the use of Saxon for the transformer
TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();
Transformer transformer;
logger.info("Perform Transform: " + source + " using " + transform + " to " + outputFile);
try {
try {
transformer = factory.newTransformer(new StreamSource(transform));
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
try {
transformer.transform(new StreamSource(source), new StreamResult(outputFile));
} catch (TransformerException e) {
logger.error("Transform Exception ", e);
}
} catch (TransformerConfigurationException e) {
logger.error("Transform Configurtion Exception ", e);
}
try {
outputFile.close();
} catch (IOException e) {
logger.error("Exception closing output stream ", e);
}
} catch (Exception e) {
logger.error("Catchall Exception performing transform ", e);
} finally {
try {
outputFile.close();
} catch (IOException e) {
logger.error("Exception closing output stream a second time ", e);
}
}
return outputFile;
}
答案 0 :(得分:0)
我相信this可以指出你正确的方向。基本上,它是为了确保您执行相同的编码(在这种情况下最好使用UTF-8)来标准化输出。 Linux和Windows有不同的换行符(分别为\ n和\ r \ n),这也会导致结果文件之间出现空白差异(因为position() function is confused可能会破坏转换)。