getAssociatedStylesheet в TransformerFactoryImpl.java выдает исключение, если DOCTYPE и PI для включения таблицы стилей оба существуют в XML
Посмотрите на код getAssociatedStylesheet(исходный код, строковый носитель, строковый заголовок, строковый набор символов), генерирует исключение TransformerConfigurationException в классе TransformerFactoryImpl:
Определение вышеупомянутой функции игнорирует XMLReader, который я передал в качестве аргумента через параметр источника (который по сути является объектом SAXSource). Вышеуказанная функция создает новый XMLReader после создания нового объекта SAXParserFactory. Из-за этого проблема, с которой мы сталкиваемся, заключается в том, что при синтаксическом анализе входного XML-файла он продолжает синтаксический анализ раздела DOCTYPE и внешнего DTD, заданного через Public ID и System ID. Теперь, так как наш XMLReader не используется для анализа XML-файла, зарегистрированный в считывателе EntityResolver не используется, и, следовательно, внешнее DTD не разрешается, и, следовательно, функция getAssociatedStylesheet завершается сбоем с исключением.
Однако, если вы посмотрите на другие публичные функции Templates, то newTemplates(Source source) выдает исключение TransformerConfigurationException в классе TransformerFactoryImpl. Эта функция специально проверяет, является ли переданный аргумент источника SAXSource, и если это так, то если XMLReader присутствует в источнике, то он не создает новый объект XMLReader.
Это ошибка? Какие-нибудь мысли?
XalanJ версия: 2.7.1 Путь к исходному файлу: src\org\apache\xalan\processor\TransformerFactoryImpl.java
Спасибо! Суровая Гупта Adobe Systems
2 ответа
Поскольку Saxon прекрасно может найти связанную таблицу стилей с помощью зарегистрированного пользовательского преобразователя сущностей, поэтому всякий раз, когда происходит преобразование с XalanJ, мы используем Saxon для получения связанной таблицы стилей.
И как только мы получим связанную таблицу стилей, мы передадим входной файл и таблицу стилей в Xalan для преобразования.
Да, я согласен с вами. Похоже, что это нарушает ожидания, присущие спецификации класса SAXSource.
В реализации Saxon используется XMLReader.
Версия JDK Xalan и Apache Xalan в этом отношении выглядит одинаково.