1

我正在使用 Saxon & XSLT 来转换我无法控制的 HTML 文档。

这些文档可能包含真正应该编码的字符,例如

而不是编码的

™

就目前而言,Saxon 在转换期间从HTMLEmitter抛出以下异常:

else if (c >= 127 && c < 160) {
                       // these control characters are illegal in HTML
                       DynamicError err = new DynamicError(
                        "Illegal HTML character: decimal " + (int) c);
                        err.setErrorCode("SERE0014");
                        throw err;

无论如何要更宽松,并告诉 Saxon 忽略并让这些字符原样通过 - 或者 - 我如何将 Saxon 配置为使用 XMLEmitter 而不是 HTMLEmitter?

4

3 回答 3

4

该字符在 HTML 中无效,因为它不一定会按照您的预期呈现,具体取决于用户的代码页。您想使用正确的代码点,&#x2122;并确保使用 UTF-8 编码。

编辑:字符映射

<xsl:character-map name="TM">
  <xsl:output-character character="&#153;" string="&#x2122;"/>
</xsl:character-map>
于 2010-12-13T16:29:52.883 回答
2

Saxon 是 XSLT 处理器,而不是 XML 解析器。如果您在解析输入文档时遇到错误,则说明是 XML 解析器(而不是 Saxon)在抱怨,这意味着您的输入不是格式正确的 XML。在 Java 平台上,如果输入是 HTML 而不是 XML,您可能会使用 TagSoup http://home.ccil.org/~cowan/XML/tagsoup/之类的东西而不是 XML 解析器。

另一方面,我同意已经发表的评论,XNL 构建并支持 Unicode,因此只要文档经过正确编码并在 XML 声明中声明使用的编码,您的输入文档就可以使用 Unicode 字符。对于 Unicode,'™' 的代码点是 8482,而不是 153。我想您的输入文档使用像 1252 这样的 Windows 代码页,在这种情况下,您的文档需要开始<?xml version="1.0" encoding="Windows-1252"?>让 XML 解析器知道。

于 2010-12-13T16:29:20.310 回答
2

除了@Martin Honnen 的回答指出 153 不是字符 ™ 的UNICODE点,而是 8482 和@Jim Garrison 建议xsl:character-map(如果您不能正确说明输入源的字符集),这里是来自http://www.w3.org/TR/xslt-xquery-serialization/#HTML_CHARDATA的错误报告的原因:

某些字符,特别是控制字符#x7F-#x9F,在 XML 中是合法的,但在 HTML 中是不合法的。当此类字符出现在数据模型的实例中时,使用 HTML 输出方法是一个序列化错误 [err:SERE0014]。串行器必须发出错误信号。

于 2010-12-13T16:46:49.777 回答