首页 > 解决方案 > XSL 实体定义被忽略 - 为什么?

问题描述

我正在编写一个将 XML 转换为 markdown 文本的 XSL 文件。我想将 HTML 实体转换为它们自己,例如“®” 在 XML 中的一段文本中将产生“®” 在输出文件中。我不想翻译“®” 到其十六进制等效值,这可能会扰乱下游流程。

在我看来,下面的声明应该做我需要的,当紧跟在 <?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.

我做错了什么?

标签: xmlxsltxml-entities

解决方案


它抱怨文件 test.xml 格式不正确。您添加到样式表中的任何内容都不会改变这一点。如果 test.xml 包含实体引用,那么它必须具有定义这些实体的 DTD。

您要实现的目标很困难,因为 XSLT 工作在 XDM 数据模型上,它无法以未扩展的形式表示实体引用。XML 解析器总是会在 XSLT 转换器启动之前扩展实体引用。

一种解决方法是 Andrew Welch 的 Lexev 工具,它预处理输入 XML 以将实体引用转换为其他内容(处理指令,IIRC),然后在序列化期间将它们转换回实体引用。

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


推荐阅读