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