Ошибки при создании html-файла с использованием xml и xsl-файла (xslt 2.0) (исправляемая ошибка ввода-вывода, о которой сообщает анализатор XML)

#java #xml #xslt #saxon

#java #xml #xslt #saxon

Вопрос:

Я использую приведенный ниже код для генерации HTML-кода из файлов xml и xsl. Для xslt 1.0 все работало нормально, но теперь я использую xslt 2.0. И я получаю эту ошибку при выполнении кода ниже: ERROR: Unsupported XSL element 'for-each-group'.'

Вы знаете, как это исправить?

 private static void createHtml(){
        try {
            TransformerFactory tf =TransformerFactory.newInstance();    
            Source xslFile =new StreamSource("test.xsl");
            Source xmlFile =new StreamSource(new StringReader(xml));

            String resultFile ="test.html";

            OutputStream htmlFile=new FileOutputStream(resultFile );
            Transformer trasform=tFactory.newTransformer(xslFile);
            trasform.transform(xmlFile, new StreamResult(htmlFile));
        }
        catch (Exception e)
        {
            System.out.println("Error.");
        }
 }
 

Я пытаюсь сделать это сейчас:

 TransformerFactory tfactory = TransformerFactory.newInstance();

Transformer transformer = tfactory.newTransformer(new StreamSource(new File("test.xsl")));

transformer.transform(new StreamSource(new File(xml)),
                new StreamResult("test.html"));
 

И в основном методе:

 System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl")
 

И я получаю эту ошибку:

 Recoverable error 
  I/O error reported by XML parser processing
 

Есть идеи, как это исправить?

Комментарии:

1. Вы получаете сообщение об for-each-group ошибке и другую ошибку «Ошибка ввода-вывода, о которой сообщает анализатор XML»? Можете ли вы показать нам минимальный, но полный ввод XML и таблицу стилей XSLT, для которой вы получаете ошибку? Также в вашем Java-коде измените предложение catch System.out.println("Error."); на e.printStackTrace(); и покажите полную трассировку стека в вашем вопросе.

Ответ №1:

Вы сообщаете о двух разных ошибках:

(a) ОШИБКА: неподдерживаемый элемент XSL ‘for-each-group’.’

(b) Исправляемая ошибка: ошибка ввода-вывода, о которой сообщает анализатор XML

Кажется маловероятным, что вы получили их из одного и того же запуска, поэтому неясно, что вы делали в каждом из этих случаев, чтобы получить две разные ошибки.

Первая ошибка означает, что по какой-то причине вы загрузили процессор XSLT, который не поддерживает XSLT 2.0. Самый безопасный и быстрый способ убедиться в загрузке Saxon — создать его напрямую:

 TransformerFactory tfactory = new net.sf.saxon.TransformerFactoryImpl();
 

Если вы полагаетесь на механизмы JAXP, могут произойти всевозможные сбои, и это также может быть очень медленным, потому что это связано с поиском пути к классу.

Со второй ошибкой вы не предоставили достаточно информации для полной диагностики. Однако тот факт, что в сообщении нет имени файла, дает подсказку: это означает, что Saxon не знает имя файла, и это часто происходит потому, что вы сделали что-то вроде:

 Source xmlFile =new StreamSource(new StringReader(xml));
 

Сам StringReader никогда не выдаст ошибку ввода-вывода. Но если анализируемый XML содержит ссылку DTD или ссылки на другие внешние объекты, и если это относительные ссылки, то анализатор XML не сможет их разрешить, поскольку у него нет базового URI для работы. Вы можете указать базовый URI во втором аргументе конструктора StreamSource.