Пропуск декларации типа документа XML при применении XSLT
У меня есть XML-файлы, которые содержат тип документа:
<!DOCTYPE someName SYSTEM "fileName.dtd">
Файл предоставлен третьей стороной, я не контролирую, как он генерируется. Я использую XSLT для преобразования XML, но XSLT жалуется на то, что dtd не найден; как мне сказать XSLT пропустить его, чтобы он не пытался получить доступ к файлу dtd, которого у меня нет.
Спасибо
3 ответа
Узнал, как это сделать для C#
XmlReaderSettings x = new XmlReaderSettings();
x.DtdProcessing = DtdProcessing.Ignore;
myXslTransform.Load(xslFile);
myXslTransform.Transform(XmlReader.Create(xslFile, x), XmlWriter.Create(xmlFileOutput));
Вы можете установить EntityResolver анализатора XML равным EntityResolver, который заменяет локальный файл (возможно, пустой файл), когда запрашивается DTD. Создайте XMLReader (синтаксический анализатор) с этим параметром, затем предоставьте SAXSource, содержащий этот XMLReader, в качестве исходного ввода для преобразования.
Какой xslt-процессор вы используете? Вы должны найти способ отключить проверку для него. Например, для Java вы можете сделать это так: http://www.stylusstudio.com/xsllist/200205/post80150.html
Основная причина, почему это здесь: dtd может иметь данные по умолчанию, которые влияют на содержимое XML. Например, если атрибут "align" имеет значение по умолчанию "left", совпадение с шаблоном xslt "[@ align = 'left']" будет совпадать, даже если атрибут отсутствует в XML.