我正在使用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"/>
这个想法听起来就像我追求的那样,但是我必须进行实验,看看角色引用是从另一端出来的。这可能是个不错的选择。
答案 0 :(得分:1)
您还没有真正解释过想要处理非ASCII字母的方式,但是当您将问题标记为xslt-2.0时,您可以访问XPath / XSLT 2.0正则表达式,例如从您可以使用replace
的任何文本节点中删除任何非ASCII字符:
<xsl:template match="text()">
<xsl:value-of select="replace(., '[^\r\n\t -~]+', '')"/>
</xsl:template>
编写替换的另一种方法是
<xsl:template match="text()">
<xsl:value-of select="replace(., '\P{IsBasicLatin}+', '')"/>
</xsl:template>
如果您不想删除所有非ASCII字符,还有normalize-unicode
函数https://www.w3.org/TR/xpath-functions/#func-normalize-unicode。