如何以编程方式修复 XSLT 中的编码错误
How to fix encoding errors programmatically in XSLT
我正在尝试从命令行批处理数千个 XML 文件,但我收到与无效字符相关的各种错误消息。
到目前为止,我已经能够通过两种不同的方式解决此问题:
- 在记事本中打开有问题的文件并转到另存为 > UTF-8
- 将编码添加到 XML 声明(出于某种原因
ISO-8859-1 也适用)
我很困惑为什么会收到这些错误消息。我在原始 XML 或 DTD 中看不到编码的提及,因此 XML 并没有声称它不是。
考虑到要处理的文件数量,我也发现单独修复每个文件很费力。我想知道是否有任何方法可以通过编程方式解决此问题,例如在 XSLT 样式表中?
错误信息是:
Error on line 80 column 128 of 12345.dxl: SXXP0003: Error reported by XML parser: Invalid byte 1 of 1-byte UTF-8 sequence.
第 128 列第 80 行似乎对应于缺少的单引号:("this governments Local Services Realignment exercise").
我尝试将字符映射添加到 XSLT,但我仍然遇到相同的错误:
<xsl:output method="text" omit-xml-declaration="yes" indent="no" use-character-maps="curly_quotes"/>
<xsl:character-map name="curly_quotes">
<xsl:output-character character="’" string="‘"/>
<xsl:output-character character="“" string="’"/>
<xsl:output-character character="”" string="“"/>
<xsl:output-character character="–" string="”"/>
</xsl:character-map>
我安装了 iconv 工具,它确实符合要求。不过,我还没有弄清楚批处理的语法。为此,我发布了一个单独的问题 here。
回答所提出的问题:通常(但见下文),无法以编程方式修复 XSLT 中的编码错误,因为 XSLT 作用于已解析的 XML 文档,而编码错误通常会阻止文档被正确解析,严格来说这意味着 是 没有 XML 文档存在,只有八位字节流无法管理 XML 格式良好。
正如@nwellnhof 指出的那样,要使用的工具是像 iconv 这样的字符集转换器。
请注意,虽然在一般情况下带有编码错误或不准确编码声明的文档不会通过 XML 解析阶段,但也有例外:并非编码声明中的所有错误都能可靠地检测到.例如,如果有一批文档都标记为 ISO 8859-1,尽管实际上它们是 ISO 8859-15(或者,我认为,几乎是 ISO 8859 的任何其他部分),那么这不太可能XML 解析器可以检测到错误;一个 XSLT 样式表执行近等同转换并用所需的编码声明写出其输入可以修复这样的错误。但这是一个非常特殊的案例。可以在 http://cmsmcq.com/2007/dialog.surrogates.xml
找到进一步的讨论(对于那些喜欢这类问题的人)
我正在尝试从命令行批处理数千个 XML 文件,但我收到与无效字符相关的各种错误消息。
到目前为止,我已经能够通过两种不同的方式解决此问题:
- 在记事本中打开有问题的文件并转到另存为 > UTF-8
- 将编码添加到 XML 声明(出于某种原因
ISO-8859-1 也适用)
我很困惑为什么会收到这些错误消息。我在原始 XML 或 DTD 中看不到编码的提及,因此 XML 并没有声称它不是。
考虑到要处理的文件数量,我也发现单独修复每个文件很费力。我想知道是否有任何方法可以通过编程方式解决此问题,例如在 XSLT 样式表中?
错误信息是:
Error on line 80 column 128 of 12345.dxl: SXXP0003: Error reported by XML parser: Invalid byte 1 of 1-byte UTF-8 sequence.
第 128 列第 80 行似乎对应于缺少的单引号:("this governments Local Services Realignment exercise").
我尝试将字符映射添加到 XSLT,但我仍然遇到相同的错误:
<xsl:output method="text" omit-xml-declaration="yes" indent="no" use-character-maps="curly_quotes"/>
<xsl:character-map name="curly_quotes">
<xsl:output-character character="’" string="‘"/>
<xsl:output-character character="“" string="’"/>
<xsl:output-character character="”" string="“"/>
<xsl:output-character character="–" string="”"/>
</xsl:character-map>
我安装了 iconv 工具,它确实符合要求。不过,我还没有弄清楚批处理的语法。为此,我发布了一个单独的问题 here。
回答所提出的问题:通常(但见下文),无法以编程方式修复 XSLT 中的编码错误,因为 XSLT 作用于已解析的 XML 文档,而编码错误通常会阻止文档被正确解析,严格来说这意味着 是 没有 XML 文档存在,只有八位字节流无法管理 XML 格式良好。
正如@nwellnhof 指出的那样,要使用的工具是像 iconv 这样的字符集转换器。
请注意,虽然在一般情况下带有编码错误或不准确编码声明的文档不会通过 XML 解析阶段,但也有例外:并非编码声明中的所有错误都能可靠地检测到.例如,如果有一批文档都标记为 ISO 8859-1,尽管实际上它们是 ISO 8859-15(或者,我认为,几乎是 ISO 8859 的任何其他部分),那么这不太可能XML 解析器可以检测到错误;一个 XSLT 样式表执行近等同转换并用所需的编码声明写出其输入可以修复这样的错误。但这是一个非常特殊的案例。可以在 http://cmsmcq.com/2007/dialog.surrogates.xml
找到进一步的讨论(对于那些喜欢这类问题的人)