删除不在指定XSLT编码中的字符



我正在尝试将UTF-8 xml源文件转换为iso-8859-1 xmlSLT删除iso-8859-1中无效的所有字符。有可能吗?

理想的方法是接收目标编码作为参数,删除与该编码有关的所有无效字符,并使用该参数设置xsl:output tag中的编码属性。

我在一个包含中文字符的文件上执行了测试,我的XSLT包含

<xsl:output method="xml" encoding="iso-8859-1" indent="yes" />

但是汉字被转换为类似于&20320

提前谢谢。

假设XSLT 1.0:
这是可能的,但相当乏味。您需要列出集合中的所有字符,然后在输出到结果树的每个文本节点上使用translate((函数(两次(。例如,这个样式表:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="charset" select="'1234567890'" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="text()">
    <xsl:value-of select="translate(., translate(., $charset, ''), '')"/>
</xsl:template>
</xsl:stylesheet>

当应用于以下输入时:

<input>
    <para>John has 3 apples.</para>
    <para>Eve has 2 oranges.</para>
</input>

将导致:

<?xml version="1.0" encoding="UTF-8"?>
<input>
  <para>3</para>
  <para>2</para>
</input>

XSL输出编码确定输出文件所在的编码

它保证写入输出文件/流的任何字符都不在为iso-8859-1定义的字符范围之外。并且字符串'&#20320;'在该范围内,你)不是。

<output charset="...">指令切换字节编码(例如,'你'在UTF-8中是0xE4 0xBD 0xA0,在UTF-16中是0x60 0x4F(,但如果这不可能,它不会阻塞文本,也就是说,它不会将输入中的汉字替换为输出中的问号(甚至更糟,什么都没有(。

它试图通过使用定义良好的编码方案来保持字符:一个编号的字符实体。显示数据的用户代理可以自由地将其显示为问号,或者如果它有能力,则可以显示为原始字符。

以下XML:

<?xml version="1.0" encoding="iso-8859-1"?>
<test>&#20320;</test>

<?xml version="1.0" encoding="UTF-8"?>
<test>你</test>

两者均显示为

<test>你</test>

在我的浏览器中,所以XSLT处理器所做的实际上是正确的。想想你是否真的想失去这些字符。

对于iso-8859-1,您可以执行

replace($x, '[^&#x1;-&#xff;]', '')

但这并不能推广到其他编码。

如果您使用的是Saxon,那么我建议您自定义序列化程序(您可以设置自己的SerializerFactory,它可以创建一个包含您自己的XMLEmitter的管道,它可以对标准XMLEmitter进行子类化,以省略不在所选编码中的字符,而不是转义它们(。

或者,对输出进行后处理(例如使用Perl或Awk(以删除所有数字字符引用。

然而,除此之外,我还要对这一要求提出质疑。你想做的似乎不是一件好事。

最新更新