是否可以为 XSL 输出指定有限的字符集?



我正在使用XSL将UTF-8 XML转换为纯文本,它将用于仅ASCII系统。大型机等。XML 中可能存在大量字符,这些字符可能会阻塞下游系统。此 XSL 存在的目的是为这些下游系统提供服务,因此我有责任为它们提供可用的文件。

我有很多不同的 XSL 在做这件事。

我已经修补了一些关键的 XSL,以使用translate()来替换我知道会遇到并造成困难的一些特定字符,但只是作为权宜之计。我不能为扩展集中的每个字符、我正在运行的每个 XSL 中的每个字段执行此操作。

我对 XML 的编码或字符集没有任何控制权。有没有一种方法可以简单地以编程方式使 XSL 在其创建的纯文本文件中仅使用 ASCII 字符?输出声明中的某种规范?

编辑:更准确地说,重要的是我不删除任何字符。就像我现在所做的那样,使用translate(),我需要用可读的替代品替换非 ASCII 字符。理想情况下,有一种方法可以告诉 XSL 使用某种标准化方法将非 ASCII 字符替换为 ASCII。

其次,我不能抛出任何错误。我对发送系统没有任何控制权,所以如果有任何错误,我不能说"嘿,此记录失败,请仅使用 ASCII 字符重新发送"。

第三,我对过程有一定的控制,所以我可以放一个额外的 XSL,在传递字符之前只翻译字符。这不是一个坏主意,因为我只需要维护一个额外的转换。但是,有近 100 个转换需要维护,所以我必须修改几乎所有的管道。如果 XSL 中没有简单的方法,这实际上可能是一个不错的选择。

<xsl:output encoding="US-ASCII"/>的想法听起来像我所追求的,但我必须进行实验,看看角色引用在另一端是什么样子的。这可能是一个不错的选择。

您还没有真正解释要以何种方式处理非ASCII字母,但是由于您将问题标记为xslt-2.0,因此您可以访问XPath/XSLT 2.0正则表达式,例如,要从任何文本节点中删除任何非ASCII字符,您可以使用replace

<xsl:template match="text()">
<xsl:value-of select="replace(., '[^rnt&#x0020;-&#x007E;]+', '')"/>
</xsl:template>

编写替换的另一种方法是

<xsl:template match="text()">
<xsl:value-of select="replace(., 'P{IsBasicLatin}+', '')"/>
</xsl:template>

还有一个normalize-unicode函数 https://www.w3.org/TR/xpath-functions/#func-normalize-unicode,如果你不想简单地删除所有非ASCII字符。

最新更新