非法 HTML 字符:十进制 141

Illegal HTML character: decimal 141

我们正在 Mac OS X 10.11 上使用 Saxon PE 9.5.1.8 处理 UTF-8 XML 输入文件。这是转换:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html" version="5.0" encoding="utf-8"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="a">
        <p><xsl:sequence select="text()"/></p>  
    </xsl:template>

</xsl:stylesheet>

这是我们 XML 输入文件的 hexdump:

$ hexdump -C utf.xml
00000000  3c 3f 78 6d 6c 20 76 65  72 73 69 6f 6e 3d 22 31  |<?xml version="1|
00000010  2e 30 22 20 65 6e 63 6f  64 69 6e 67 3d 22 55 54  |.0" encoding="UT|
00000020  46 2d 38 22 3f 3e 0a 3c  72 6f 6f 74 3e 0a 3c 61  |F-8"?>.<root>.<a|
00000030  3e 30 78 43 32 42 35 3d  22 3c 21 5b 43 44 41 54  |>0xC2B5="<![CDAT|
00000040  41 5b c2 b5 5d 5d 3e 22  3c 2f 61 3e 0a 3c 61 3e  |A[..]]>"</a>.<a>|
00000050  30 78 43 32 38 44 3d 22  3c 21 5b 43 44 41 54 41  |0xC28D="<![CDATA|
00000060  5b c2 8d 5d 5d 3e 22 3c  2f 61 3e 0a 3c 2f 72 6f  |[..]]>"</a>.</ro|
00000070  6f 74 3e 0a                                       |ot>.|
00000074

重要的字符是 (i) 00000040 行,0xC2B5 表示为 [..] 中的两个 . 字符,以及 (ii) 00000060 行,0xC28D 表示为 . 中的两个 . 字符[..].

中的字符

以下是如何从 *nix 命令生成我们的 XML 输入文件 shell:

echo '<?xml version="1.0" encoding="UTF-8"?>'
echo '<root>'
echo -e '<a>0xC2B5="<![CDATA[\xc2\xb5]]>"</a>'    # micro sign
echo -e '<a>0xC28D="<![CDATA[\xc2\x8d]]>"</a>'    # control character
echo '</root>'

我们的转换终止于:

SERE0014: Illegal HTML character: decimal 141"

十进制141是0x8D,也就是我们控制字符0xC28D的第二个字节。为什么 Saxon 会选择 0x8D 字符并将其视为无效?我们希望 Saxon 将其视为有效的 2 字节 UTF-8 字符 0xC28D 的字节 #2。

我们知道当我们可以用method="xml"创建HTML;但是,这样做 (i) 不会发出我们致力于生成的 HTML5,并且 (ii) 从 HTML 输出中删除 0xC2 字节。

如果我理解正确,那么您想将 UTF-8 编码 XML 文档中的 Unicode 字符 UC28D 提供给 XSLT。据 https://dotnetfiddle.net/HuNLpC 告诉我,表示 UTF-8 中该字符的三字节序列是 EC 8A 8D 而不是您的十六进制转储包含的两字节序列 C2 8D 。所以我认为问题出在您的输入或输入生成上,它不包含分别为您的字符创建正确的 UTF-8 编码。

另请参阅我的评论,如果您使用 XML 字符引用,例如<root><a>0xC2B5="&#xC2B5;"</a><a>0xC28D="&#xC28D;"</a></root> 然后 Saxon(使用 9.5、9.6 和 9.7 进行测试)确实将带有样式表的输入转换为 HTML 文档,而不会抱怨任何错误或非法 HTML 字符。