You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:48:02