如何在XSLT中处理HTML实体?解决Saxon报 未定义问题
实体未定义报错的核心原因 你在XSLT文件头部添加的DOCTYPE实体声明,作用范围仅限当前XSLT样式表本身,不会自动继承给传入Saxon处理的源XHTML文档。Saxon是在解析源文档阶段就遇到了没有定义的 实体,这一步还没开始执行XSLT逻辑,自然读不到你写在样式表里的实体定义,直接抛出错误。
可落地的解决方法
- 直接修改源XHTML文档添加实体声明
如果你有权限改动待转换的源文件,直接在源文件的XML声明之后、根节点之前补充实体定义即可,这是兼容性最好的方案:
加上这段声明后Saxon解析源文档时就能识别<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html [ <!ENTITY nbsp " "> ]> <!-- 后续保留原完整XHTML文档的全部内容即可 --> 实体,不会再报错。 - 为Saxon配置自定义实体解析器
如果不方便修改源文件,可以在初始化Saxon 9.9 PE的解析流程时注册自定义EntityResolver,当解析器遇到nbsp实体引用时,直接返回对应U+00A0非断空格字符即可,全程不需要改动源文件或样式表。 - 转换前做预处理替换
在把源文档传入Saxon做XSLT转换前,先做一次轻量文本替换,把所有 直接替换为UTF-8编码的非断空格原生字符、或者字符引用 ,从根源上消除未定义实体,这种方案不依赖特定Saxon版本或配置,适配所有XSLT处理器。
注意:XML规范里实体声明的作用域是严格限定在当前解析的XML文件内的,不存在跨文件的实体声明继承,不要试图通过在样式表、其他第三方文件里加声明的方式解决源文档的实体缺失问题,这类写法从原理上就不会生效。
内容的提问来源于stack exchange,提问作者Diego Schiavon
相关产品推荐
相关产品推荐

