Как разрешить DTD в XML-документах, загружаемых с помощью функции document (uri) XSLT с помощью XslCompiledTransform (.NET) - PullRequest
2 голосов
/ 20 сентября 2009

Когда функция document(uri) используется для загрузки другого документа в XSLT, где целевой документ содержит DTD, я получаю XslTransformException, содержащий внутренний XmlException:

В целях безопасности DTD запрещен в этом документе XML. Чтобы включить обработку DTD, установите для свойства ProhibitDtd в XmlReaderSettings значение false и передайте параметры в метод XmlReader.Create.

Поскольку XmlReader создается в реализации XSLT, прямого способа создания XmlReader с нужными настройками нет, и ни один из XslCompiledTransform, XmlResolver 1 или связанных классов кажется, предоставляют любую форму крючка.

(Я использую DTD для настройки некоторых сущностей HTML, чтобы упростить создание документа.)

1 на основе просмотра XmlUrlResolver в Reflector, это просто загрузило цель URI в виде потока.

например. XSLT содержит

<xsl:apply-templates select="document('more.xml')/root"/>

и more.xml содержат DTD, тогда исключение, приведенное выше, является результатом.

1 Ответ

3 голосов
/ 10 марта 2010

То же XmlResolver, которое вы передаете методу Transform, используется для функции документа, этот преобразователь может вернуть XmlReader, который разрешает DTD, вместо возврата Stream. Вы также можете вернуть IXPathNavigable. Другими словами, вам нужна специализированная реализация XmlResolver, чтобы решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...