#java #xslt #stream #ioexception
#java #xslt #поток #исключение ioexception
Вопрос:
Я использую xslt вместе с java для обработки и преобразования входных XML-файлов для создания нескольких результирующих документов. Но я получаю ошибку ниже в transformer.transform (ввод, вывод) в моем классе преобразования Java.
Пожалуйста, помогите мне в этом.
Трассировка стека:
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 amp;amp; !filesToBeTransformed.isEmpty()) {
for (File file : filesToBeTransformed) {
Source input = new StreamSource(file);
transformer.transform(input, output);
}
}
}
Заранее спасибо!!
Ответ №1:
Вы пытаетесь добавить несколько результатов преобразования в один и тот же выходной поток, и это не работает.
Я думаю, что это, вероятно, сработало бы, если бы вы создали FileOutputStream
и указали это в StreamResult
, вместо того, чтобы указывать File
. По сути, тот, кто создает поток, несет ответственность за его закрытие, и если вы укажете a File
, то Saxon создаст поток и закроет его в конце преобразования, но если вы создадите поток, вы можете выбрать, закрывать его или нет.
В вашем прозаическом вопросе говорится, что вы пытаетесь создать несколько выходных документов, но ваш код, похоже, пытается создать один результирующий документ. Что это?
Также обратите внимание, что с Saxon мы рекомендуем выполнить TransformerFactory.newTemplates()
однократную компиляцию таблицы стилей, а затем создавать новую Transformer
для каждого преобразования с использованием Templates.newTransformer()
. Последовательное повторное использование одного Transformer
разрешено, но может привести к ненужному накоплению ресурсов во внутренних кешах.
Комментарии:
1. Спасибо за ваше предложение, я попробовал, но это не решило мою проблему. Как вы сказали, я не создаю несколько файлов через java, но я создаю несколько файлов через xslt внутри
outputDirectory
location.2. Итак, что вы изменили? Мой совет заключается в том, что вы не пытаетесь повторно использовать один и тот же StreamResult для нескольких преобразований.