问题描述
我正在使用xslt和java来处理和转换输入的xml文件以产生多个结果文档。 但是我在java转换类中的transformer.transform(输入,输出)处遇到错误。
请帮助我。
堆栈跟踪:
java.io.IOException: Stream Closed
net.sf.saxon.trans.XPathException: java.io.IOException: Stream Closed
at net.sf.saxon.event.XMLEmitter.close(XMLEmitter.java:264)
at net.sf.saxon.event.ProxyReceiver.close(ProxyReceiver.java:90)
at net.sf.saxon.event.UncommittedSerializer.close(UncommittedSerializer.java:53)
at net.sf.saxon.event.ImplicitResultChecker.close(ImplicitResultChecker.java:92)
at net.sf.saxon.event.ProxyReceiver.close(ProxyReceiver.java:90)
at net.sf.saxon.event.ComplexContentOutputter.close(ComplexContentOutputter.java:507)
at net.sf.saxon.Controller.transformDocument(Controller.java:1848)
at net.sf.saxon.Controller.transform(Controller.java:1621)
Java代码段:
String outputDirectory = fileParentLocation + "\\resultFolder\\";
Filetools.createDirectory(new File(outputDirectory));
try {
TransformerFactory factory =
TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",getClass().getClassLoader());
InputStream xsltResourceAsstream =
getClass().getClassLoader().getResourceAsstream("ConvertInputXmlFiles.xslt");
Source xslt = new StreamSource(xsltResourceAsstream);
Result output = new StreamResult(new File(outputDirectory + "test.xml"));
Transformer transformer = factory.newTransformer(xslt);
transformer.setParameter("versionName",versionName);
if (filesToBeTransformed != null && !filesToBeTransformed.isEmpty()) {
for (File file : filesToBeTransformed) {
Source input = new StreamSource(file);
transformer.transform(input,output);
}
}
}
谢谢!
解决方法
您试图将多个转换结果附加到同一输出流,但这是行不通的。
我认为,如果您创建了FileOutputStream
并在StreamResult
中提供了它,而不是提供了File
,那可能会起作用。基本上,创建流的人都有责任关闭它,如果您提供File
,则Saxon会创建流,并在转换结束时将其关闭,但是如果创建流,则可以选择是否关闭它。
您的散文问题说您正在尝试生成多个输出文档,但是您的代码似乎正在尝试生成单个结果文档。是哪一个?
还请注意,对于Saxon,我们建议执行一次TransformerFactory.newTemplates()
来编译样式表,然后使用Transformer
为每个转换创建一个新的Templates.newTransformer()
。允许单个Transformer
的串行重用,但可能导致内部缓存中不必要的资源积累。