在XSLT转换中允许无效的HTML字符

时间:2010-12-13 16:09:48

标签: xml xslt saxon

我正在使用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使用XMLEmitter而不是HTMLEmitter?

3 个答案:

答案 0 :(得分:4)

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

编辑:字符映射

<xsl:character-map name="TM">
  <xsl:output-character character="&#153;" string="&#x2122;"/>
</xsl:character-map>

答案 1 :(得分: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解析器知道。< / p>

答案 2 :(得分:2)

除了@Martin Honnen的回答,他指出153不是 UNICODE 对于角色™,而是8482,以及@Jim Garrison推荐xsl:character-map(如果可以的话) t正确陈述输入源的字符集),这里是来自http://www.w3.org/TR/xslt-xquery-serialization/#HTML_CHARDATA的错误报告的reazon:

  

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