XSL 实体定义被忽略 - 为什么?
XSL entity definitions ignored - why?
我正在编写一个将 XML 转换为降价文本的 XSL 文件。我想将 HTML 个实体转换为它们自己,例如“®”在 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 字符映射来实现。
我正在编写一个将 XML 转换为降价文本的 XSL 文件。我想将 HTML 个实体转换为它们自己,例如“®”在 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 字符映射来实现。