当使用 document(uri)
函数加载 XSLT 中的另一个文档时,目标文档包含 DTD,我得到一个 XslTransformException
,其中包含一个内部 XmlException
:
For security reasons DTD is prohibited in this XML document. To enable DTD processing set the ProhibitDtd property on XmlReaderSettings to false and pass the settings into XmlReader.Create method.
由于 XmlReader
是在 XSLT 实现中创建的,因此没有直接的方法可以使用我想要的设置创建 XmlReader,并且 XslCompiledTransform
、 都没有XmlResolver
1 或相关类似乎提供任何形式的钩子(Hook)。
(我使用 DTD 来设置一些 HTML 实体,以使文档的创作更加容易。)
1 基于在 Reflector 中查看 XmlUrlResolver
,这只是将 URI 的目标加载为 Stream。
例如XSLT 包含
<xsl:apply-templates select="document('more.xml')/root"/>
并且more.xml
包含DTD,那么上面的异常就是结果。
最佳答案
传递给 Transform
方法的同一个 XmlResolver
用于文档函数,此解析器可以返回一个允许 DTD 的 XmlReader
,而不是返回Stream
。您还可以返回 IXPathNavigable。换句话说,您需要专门实现 XmlResolver
来解决此问题。
关于.net - 如何允许使用 XslCompiledTransform (.NET) 通过 XSLT 的 document(uri) 函数加载 XML 文档中的 DTD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1451704/