在 xslt 转换期间在我的 java 代码中出现 "net.sf.saxon.trans.XPathException: java.io.IOException: Stream Closed" 异常

Getting "net.sf.saxon.trans.XPathException: java.io.IOException: Stream Closed" exception in my java code during xslt transformation

我正在使用 xslt 和 java 来处理和转换输入 xml 文件以生成多个结果文档。 但是我在 java 转换 class.

中的 transformer.transform(input, output) 处出现错误

请帮帮我。

堆栈跟踪:

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() 来编译样式表,然后使用 Templates.newTransformer() 为每个转换创建一个新的 Transformer。单个 Transformer 的串行重用是允许的,但可能会导致内部缓存中不必要的资源积累。