Получение «net.sf.saxon.trans.Исключение XPathException: java.io.IOException: поток закрыт» в моем java-коде во время преобразования xslt

#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 для нескольких преобразований.