MSXML加载fo2html.xsl提示xsl:stylesheet未在DTD声明如何解决?
错误根本原因
你使用的fo2html.xsl自带内部DOCTYPE子集,仅定义了两个实体,未声明xsl:stylesheet等XSLT元素,MSXML默认开启DTD验证,检测到根元素未在DTD中定义就抛出该错误,你之前的配置遗漏了关键的验证开关设置。
方案1:调整MSXML加载配置(无需修改xsl文件)
所有属性配置必须在调用load()方法之前执行,正确配置顺序如下:
- 关闭DTD禁止开关:将
ProhibitDTD属性设为VARIANT_FALSE - 关闭自动验证功能:将
validateOnParse属性设为VARIANT_FALSE - 保持
resolveExternals为VARIANT_TRUE确保内部实体能正常解析
配置代码示例:
VARIANT v; VariantInit(&v); // 允许DTD解析 v.vt = VT_BOOL; v.boolVal = VARIANT_FALSE; hr = pXMLDoc->setProperty(L"ProhibitDTD", v); // 关闭DTD验证 v.boolVal = VARIANT_FALSE; hr = pXMLDoc->put_validateOnParse(v.boolVal); // 允许解析内部实体 v.boolVal = VARIANT_TRUE; hr = pXMLDoc->put_resolveExternals(v.boolVal); // 最后执行加载操作 hr = pXMLDoc->load(vSource, &vbResult);
方案2:修改fo2html.xsl文件(无需调整代码)
两种修改方式二选一即可:
方式A:补充DOCTYPE元素声明
在原DOCTYPE内部子集里新增元素和属性声明,修改后的DOCTYPE块如下:
<!DOCTYPE xsl:stylesheet [ <!ENTITY anchor "<xsl:apply-templates select='@id' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'/>"> <!ENTITY add-style "<xsl:call-template name='add-style-attribute' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'/>"> <!-- 新增以下声明 --> <!ELEMENT xsl:stylesheet ANY> <!ATTLIST xsl:stylesheet version CDATA #REQUIRED xmlns:xsl CDATA #FIXED "http://www.w3.org/1999/XSL/Transform" xmlns:fo CDATA #FIXED "http://www.w3.org/1999/XSL/Format" exclude-result-prefixes CDATA #IMPLIED> ]>
方式B:移除DOCTYPE并替换实体
把文件中所有&anchor;和&add-style;的引用直接替换为对应的实体内容,再删除整个DOCTYPE块,即可完全避免DTD相关验证问题。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

