XSL 实体定义被忽略 - 为什么?

XSL entity definitions ignored - why?

我正在编写一个将 XML 转换为降价文本的 XSL 文件。我想将 HTML 个实体转换为它们自己,例如“®”在 XML 中的一段文本中将产生“®”在输出文件中。我不想翻译“®”到它的十六进制等价物,这很容易扰乱下游进程。

在我看来,紧跟在 标记之后的以下声明应该可以满足我的需要:

<!DOCTYPE stylesheet [
  <!ENTITY reg    "&amp;reg;" >
  <!ENTITY trade  "&amp;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),然后在序列化期间将它们转换回实体引用。

另一种方法(可能更好)是在序列化期间用 &reg; 替换所有出现的 ®(无论它们是否起源于 &reg;),您可以使用 XSLT 2.0 字符映射来实现。