我有包含 doctype 的 XML 文件:
<!DOCTYPE someName SYSTEM "fileName.dtd">
该文件由第 3 方提供,我无法控制它的生成方式。我使用 XSLT 转换 XML,但 XSLT 抱怨找不到 dtd;我如何告诉 XSLT 忽略它,这样它就不会尝试访问我没有的 dtd 文件。
谢谢
我有包含 doctype 的 XML 文件:
<!DOCTYPE someName SYSTEM "fileName.dtd">
该文件由第 3 方提供,我无法控制它的生成方式。我使用 XSLT 转换 XML,但 XSLT 抱怨找不到 dtd;我如何告诉 XSLT 忽略它,这样它就不会尝试访问我没有的 dtd 文件。
谢谢
您可以将 XML 解析器的 EntityResolver 设置为在请求 DTD 时替换本地文件(可能是空文件)的 EntityResolver。使用此设置创建一个 XMLReader(解析器),然后提供一个包含此 XMLReader 的 SAXSource 作为转换的源输入。
您使用哪个 xslt 处理器?您必须找到一种方法来禁用它的验证。例如,对于 Java,您可以这样做:http: //www.stylusstudio.com/xsllist/200205/post80150.html
它在这里的主要原因:dtd 可能具有影响 xml 内容的默认数据。例如,如果属性“align”具有默认值“left”,那么即使 XML 中没有出现属性,xslt 模板匹配“[@align='left']”也会匹配。
了解如何为 C# 执行此操作
XmlReaderSettings x = new XmlReaderSettings();
x.DtdProcessing = DtdProcessing.Ignore;
myXslTransform.Load(xslFile);
myXslTransform.Transform(XmlReader.Create(xslFile, x), XmlWriter.Create(xmlFileOutput));