【问题标题】:Allow invalid HTML characters in XSLT transformation在 XSLT 转换中允许无效的 HTML 字符
【发布时间】:2010-12-13 16:09:48
【问题描述】:

我正在使用 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?

【问题讨论】:

  • XML 允许任意字符,只要编码正确。唯一的例外是通常的:&lt;&gt;'"&amp;,它必须通过实体引用来表达。另外,什么是 HTML 字符
  • @Dimitre:这是一个公平的xslt 问题。
  • @Alejandro:如果问题的标题是正确的并且不只是针对撒克逊人,我会同意。标题中的问题是如何使用撒克逊语处理无效的 XML 字符,而 OP 真正想要的是如何输出某些特殊字符。
  • @Dimitre:很公平,也更正标题...

标签: xml xslt saxon


【解决方案1】:

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

编辑:字符映射

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

【讨论】:

  • 我知道它是无效的 HTML,但为了争论,无论如何都可以忽略它。我绝对不能更改源 HTML。
  • 能否在 XSLT 中使用字符映射将无效字符转换为正确的编码?
  • 效果很好,假设我添加了 127 到 160 之间的每个字符。这样做会对性能造成重大影响吗?
  • 我希望地图查找为 O(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 代码页,在这种情况下,您的文档需要以 &lt;?xml version="1.0" encoding="Windows-1252"?&gt; 开头让 XML 解析器知道。

【讨论】:

  • 好的,但是假设我绝对不能更改源 HTML,并且假设源编码声明是错误的,有没有办法通过它(是的,我知道它可能不会呈现,但是对于我不相关的用例)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多