.net - 如何允许使用 XslCompiledTransform (.NET) 通过 XSLT 的 document(uri) 函数加载 XML 文档中的 DTD

标签 .net xslt

当使用 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 都没有XmlResolver1 或相关类似乎提供任何形式的钩子(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/

相关文章:

.net - 使用 StructureMap 实现策略模式的最佳方法

c# - 如何检测 Windows 10 何时在 Windows 窗体应用程序中进入平板电脑模式?

html-parsing - 如何防止 PHP::XSLTProcessor 生成 <html> 和 <body> 标签?

xml - Tokenize() 中的 XSL XPATH if 语句

c# - CrystalReportViewer - 在参数加载/点击确认按钮后触发事件

c# - CLR 4.0 中的垃圾收集改进

c# - 不同系统配置的最佳IO线程数

xml - XSLT 根据子元素属性对父元素进行排序

xml - 如何保留 xml 文档中的所有标记、结构和文本,仅用 XSLT 替换部分标记、结构和文本?

html - 使用 xsl :element tag for html transformation