在xslt转换期间,我的java代码中出现“ net.sf.saxon.trans.XPathException:java.io.IOException:流关闭”异常

问题描述

我正在使用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的串行重用,但可能导致内部缓存中不必要的资源积累。