#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-коде измените предложение catchSystem.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.