使用 Apache FOP 2.3 的空 xsl 导致 eclipse
Empty xsl result in eclipse using Apache FOP 2.3
我有 XSL 样式表和一些 XML 示例文件可以转换为 PDF。我已经验证了 XSL 工作表是正确的(使用 Apache-FOP 2.3
的命令行版本生成的 PDF 是一致的,并且没有抛出任何错误)。当我将 Eclipse > Run > Transform
与 Xalan 2.7.1
一起使用时,结果与命令行版本的 FO
输出相同。
然而,从那以后我就尝试在 java 中实现嵌入式版本,但一直没有成功。我检查了 FO
结果,它似乎没有任何 FO
标记,结果文件只包含 XML 的文本值。这导致 fop.fo.ValidationException
.
我怀疑它与某些库的版本冲突或 属性 文件中缺少参数有关,但到目前为止我还没有找到错误。
编辑
我无法共享 XSL 和 XML 文件,但这是我的 java 片段:
private void transformToPdf(Document docJDOM, OutputStream destination, File xslFile)
throws SAXException, IOException, JDOMException, TransformerException {
FopFactory fopFactory = FopFactory.newInstance(FOPCONFIGFILE);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, destination);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new
StreamSource(xslFile));
Source source = new DOMSource(transformJdomToDom(docJDOM));
Result result = new SAXResult(fop.getDefaultHandler());
transformer.transform(source, result);
}
其中 FOPCONFIGFILE 是我的 fop.xconf 文件(我使用的是 Apache-FOP 网站中提供的默认文件),docJDom 是我希望转换的 xml 文件和 xslFile 的 JDomDocument是我希望应用的 xslStylesheet。我检查了 docJDom、xslFile 的值,它们是正确的。
编辑 2
我刚刚尝试使用嵌入式代码输出 fo 结果文件
通过改变这个
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new
StreamSource(xslFile));
Source source = new DOMSource(transformJdomToDom(docJDOM));
Result result = new SAXResult(fop.getDefaultHandler());
transformer.transform(source, result);
至此
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xslFile));
Source source = new DOMSource(transformJdomToDom(docJDOM));
Result result = new StreamResult(destination);
transformer.transform(source, result);
并检查了生成的 fo 是否有错误。我能够找到多行,例如 <fo:table-row height="0.5cm"/>
,这是错误的来源。
但是,我随后使用相同的 XSL 样式表但使用 Apache-FOP 2.3 二进制分发版转换了相同的 XML 文件,生成的 fo 是正确的并且不包含这些错误。
我找到了错误:XSL 样式表是正确的,问题是使用这些文件的模块将它们复制到不同的文件夹并使用这些副本进行 pdf 转换。通过 运行 单独的单元测试,我更正后的 XSL 工作表没有被复制,因此我使用的是旧的不正确版本。
我有 XSL 样式表和一些 XML 示例文件可以转换为 PDF。我已经验证了 XSL 工作表是正确的(使用 Apache-FOP 2.3
的命令行版本生成的 PDF 是一致的,并且没有抛出任何错误)。当我将 Eclipse > Run > Transform
与 Xalan 2.7.1
一起使用时,结果与命令行版本的 FO
输出相同。
然而,从那以后我就尝试在 java 中实现嵌入式版本,但一直没有成功。我检查了 FO
结果,它似乎没有任何 FO
标记,结果文件只包含 XML 的文本值。这导致 fop.fo.ValidationException
.
我怀疑它与某些库的版本冲突或 属性 文件中缺少参数有关,但到目前为止我还没有找到错误。
编辑 我无法共享 XSL 和 XML 文件,但这是我的 java 片段:
private void transformToPdf(Document docJDOM, OutputStream destination, File xslFile)
throws SAXException, IOException, JDOMException, TransformerException {
FopFactory fopFactory = FopFactory.newInstance(FOPCONFIGFILE);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, destination);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new
StreamSource(xslFile));
Source source = new DOMSource(transformJdomToDom(docJDOM));
Result result = new SAXResult(fop.getDefaultHandler());
transformer.transform(source, result);
}
其中 FOPCONFIGFILE 是我的 fop.xconf 文件(我使用的是 Apache-FOP 网站中提供的默认文件),docJDom 是我希望转换的 xml 文件和 xslFile 的 JDomDocument是我希望应用的 xslStylesheet。我检查了 docJDom、xslFile 的值,它们是正确的。
编辑 2 我刚刚尝试使用嵌入式代码输出 fo 结果文件 通过改变这个
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new
StreamSource(xslFile));
Source source = new DOMSource(transformJdomToDom(docJDOM));
Result result = new SAXResult(fop.getDefaultHandler());
transformer.transform(source, result);
至此
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xslFile));
Source source = new DOMSource(transformJdomToDom(docJDOM));
Result result = new StreamResult(destination);
transformer.transform(source, result);
并检查了生成的 fo 是否有错误。我能够找到多行,例如 <fo:table-row height="0.5cm"/>
,这是错误的来源。
但是,我随后使用相同的 XSL 样式表但使用 Apache-FOP 2.3 二进制分发版转换了相同的 XML 文件,生成的 fo 是正确的并且不包含这些错误。
我找到了错误:XSL 样式表是正确的,问题是使用这些文件的模块将它们复制到不同的文件夹并使用这些副本进行 pdf 转换。通过 运行 单独的单元测试,我更正后的 XSL 工作表没有被复制,因此我使用的是旧的不正确版本。