Xml 我可以为XSL输出指定有限的字符集吗?

Xml 我可以为XSL输出指定有限的字符集吗?,xml,xslt-2.0,plaintext,Xml,Xslt 2.0,Plaintext,我正在使用XSL将UTF-8XML转换为纯文本,它将用于仅限ASCII的系统。大型机等等。XML中可能存在大量字符,这些字符将阻塞下游系统。这个XSL存在的目的是为那些下游系统提供服务,所以我有责任为它们提供可用的文件 我有很多不同的XSL来实现这一点 我修补了一些关键的XSL,使用translate()替换了一些我知道会遇到并造成困难的特定字符,但这只是权宜之计。对于扩展集中的每个字符,对于我运行的每个XSL中的每个字段,我都不能这样做 我对XML的编码或字符集没有控制权。有没有一种方法可以让

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

我有很多不同的XSL来实现这一点

我修补了一些关键的XSL,使用
translate()
替换了一些我知道会遇到并造成困难的特定字符,但这只是权宜之计。对于扩展集中的每个字符,对于我运行的每个XSL中的每个字段,我都不能这样做

我对XML的编码或字符集没有控制权。有没有一种方法可以让XSL在创建的明文文件中只使用ASCII字符?输出声明中的某种规范

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

第二,我不能犯任何错误。我对发送系统没有任何控制权,因此如果有任何错误,我不会说“嘿,这条记录失败了,请只使用ASCII字符重新发送。”

第三,我可以控制这个过程,因此我可以添加一个XSL,在传递字符之前只翻译字符。这不是一个坏主意,因为我只需要维护一个额外的转换。然而,有将近100个转换需要我维护,所以我必须修改它们的几乎所有管道。如果XSL中没有简单的方法,那么这实际上可能是一个很好的选择


这个想法听起来像是我想要的,但我必须进行实验,看看从另一端出来的角色引用是什么样子。这可能是一个很好的选择。

您没有真正解释您希望以何种方式处理非ASCII字母,但是您已经标记了问题,因为您可以访问XPath/XSLT 2.0正则表达式,例如,要从任何文本节点删除任何非ASCII字符,您可以使用
替换

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

编写替换项的另一种方法是

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


如果您不想简单地删除所有非ASCII字符,还有
normalize unicode
函数。

好的,有
,请参阅它的作用,如果您的元素名称包含非ASCII字符,您将得到一个错误,如果您的数据包含非ASCII字符,该字符将作为字符引用输出。如果输出方法为
text
,则根据,如果选择
encoding=“US-ASCII”
,则非ASCII数据将出现错误。@MartinHonnen引用的字符实体引用是否可接受?或者,甚至比您现在做的更好?您是否可以运行两个XSLT,第一个用于转换所有
text()
值,第二个用于将XML格式化为文本?无论如何,XSL可能不是进行此转换的最佳工具。(如果必须的话,我会用锤子。)你能在XSL步骤之后在管道中插入另一个过程来过滤或音译字符吗?不幸的是,XSL是我唯一的选择。我宁愿处理几乎任何其他事情。这是个好主意。它与我现在所做的非常相似,但省去了指定每个字符和每个替换字符的麻烦。一个缺点(如
translate()
)是,在某些情况下,在将元素写入文本文件之前,我需要“清理”150个或更多的元素。有很多地方可以添加
replace()
调用。另外,我编写的系统不允许所有XSL功能,或者我会在其中编写一个
XSL:function
,其中包含
replace
translate
,并使用它来写出值。如果您想从输入中的所有文本中去掉非ASCII字符,那么上面的模板应该这样做,独立于任何父元素或父元素名称。所以我不明白为什么需要在150个位置使用
replace
。但您还没有展示任何现有的转换。最好问一个关于如何简化样式表的新问题。不,我只是错过了这一部分。我对XSL还是新手,所以我并不清楚这不一定是每个元素的事情。