【问题标题】:Encoding Issues in XSL TransformationXSL 转换中的编码问题
【发布时间】:2013-03-01 14:48:58
【问题描述】:

我遇到了与此处讨论的类似的编码问题:cross-encoding XSL transformations

这些问题没有给出明确的答案;这就是为什么我再次问它的原因。

我有一个以 UTF8 编码的 XML 输入文件。 我有一个 XSL 转换应用于这些文件,它应该生成一个在 Windows-1252 中编码的 XML 输出。

我的 XSLT 文件中有以下两个声明:

<?xml version="1.0" encoding='Windows-1252'?>

<xsl:output method="text" indent="yes" encoding="Windows-1252"/>

我使用 Saxon 作为 XSL 处理器。 除此之外,每次遇到没有 Windows-1252 等效项的 UTF8 字符时,我仍然会遇到致命错误。 实际上,我并不真正关心这些角色,我的转变可能会放弃所有这些角色。我只希望转型继续进行,不要因为它们而崩溃。

我错过了什么?为什么还有这个致命错误(Fatal Error!Output character not available in this encoding)?

提前感谢您的帮助。

【问题讨论】:

    标签: xslt encoding


    【解决方案1】:

    您描述的消息仅使用文本输出方法生成(使用 XML 或 HTML,序列化程序将使用数字字符实体)。此错误是规范要求的 (见http://www.w3.org/TR/xslt-xquery-serialization/#TEXT_ENCODING),虽然我能理解为什么你可能想要一个更温和的后备,例如输出替代字符。

    如果你不介意一点 Java 编码,可以很容易地替换你自己的 Saxon 的 TEXTEmitter 版本,它做事不同(你只需要重写一个方法);或者,您可以将 XSLT 输出发送到 Java Writer(编码将被忽略),并使用 Java I/O 框架将字符转换为所需的编码,无论您的应用程序需要什么处理无效字符。

    【讨论】:

    • 首先,感谢您的回答。第二次因为我的反馈延迟而感到羞耻……第三,老实说,我想阻止我们在流程中添加更多层次。最后,我们选择使用 XPath 和正则表达式(即:)的组合来应用特定的“重新编码”模板。但是你关于在 Saxon 上替换一些方法的建议很有趣,我可能会尝试这个来改进我们的实现。
    【解决方案2】:

    UTF-8 是比 Windows-1252 更大的字符集

    这意味着某些 UTF-8 字符无法转换为 windows-1252

    问问自己为什么需要在编码之间进行转换

    【讨论】:

    • 其实我什至可以尝试回答自己:-)
    • 输入编码来自 XML Web 收集的文件,输出由最终应用程序修复。如果需要,我可以在 XSLT 之外使用特定的重新编码方法,但我很惊讶没有找到 XSLT 解决方案。不过,我不关心重新编码这些字符,只是转义它们就可以了。
    猜你喜欢
    • 2017-02-18
    • 2011-03-15
    • 2017-01-29
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    相关资源
    最近更新 更多