xml - XSL 实体定义被忽略 - 为什么?
问题描述
我正在编写一个将 XML 转换为 markdown 文本的 XSL 文件。我想将 HTML 实体转换为它们自己,例如“®” 在 XML 中的一段文本中将产生“®” 在输出文件中。我不想翻译“®” 到其十六进制等效值,这可能会扰乱下游流程。
在我看来,下面的声明应该做我需要的,当紧跟在 <?xml...?> 标记之后:
<!DOCTYPE stylesheet [
<!ENTITY reg "&reg;" >
<!ENTITY trade "&trade;" >
]>
但是,当我处理 XML 文件时,XSL 处理器 (Saxonica HE) 在每次使用实体时都会发出如下消息:
Error on line 6 column 12 of test.xml:
SXXP0003: Error reported by XML parser: The entity "reg" was referenced, but not declared.
我做错了什么?
解决方案
它抱怨文件 test.xml 格式不正确。您添加到样式表中的任何内容都不会改变这一点。如果 test.xml 包含实体引用,那么它必须具有定义这些实体的 DTD。
您要实现的目标很困难,因为 XSLT 工作在 XDM 数据模型上,它无法以未扩展的形式表示实体引用。XML 解析器总是会在 XSLT 转换器启动之前扩展实体引用。
一种解决方法是 Andrew Welch 的 Lexev 工具,它预处理输入 XML 以将实体引用转换为其他内容(处理指令,IIRC),然后在序列化期间将它们转换回实体引用。
另一种方法(可能更好)是在序列化期间替换所有出现的 ®(无论它们是否起源®
)®
,这可以使用 XSLT 2.0 字符映射来实现。
推荐阅读
- ios - NavigationLink SwiftUI 导致加载图像时出现问题
- python - 哪个代码更简洁高效?
- twitter-bootstrap - 无行与有行的引导容器只有一列,宽度为 100%
- azure - 如何调试 Azure Stack 应用服务 webfarm 部署因超时而失败?
- c# - 像 Visual Studio 代码界面一样渲染文本
- spring-boot - 构建 Spring 循环依赖的更好方法
- list - 如何使用 TextField 编辑 api url?
- pandas - 使用 pandas 的堆叠条形图
- python - 序列化与 json 格式有关系的对象 | 姜戈
- swift - SwiftUI navigationBarItems:设备旋转时出现“通过属性检测到循环”错误