我正在尝试将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
定义的字符范围之外。并且字符串'你'
在该范围内,你)不是。
<output charset="...">
指令切换字节编码(例如,'你'
在UTF-8中是0xE4 0xBD 0xA0
,在UTF-16中是0x60 0x4F
(,但如果这不可能,它不会阻塞文本,也就是说,它不会将输入中的汉字替换为输出中的问号(甚至更糟,什么都没有(。
它试图通过使用定义良好的编码方案来保持字符:一个编号的字符实体。显示数据的用户代理可以自由地将其显示为问号,或者如果它有能力,则可以显示为原始字符。
以下XML:
<?xml version="1.0" encoding="iso-8859-1"?>
<test>你</test>
和
<?xml version="1.0" encoding="UTF-8"?>
<test>你</test>
两者均显示为
<test>你</test>
在我的浏览器中,所以XSLT处理器所做的实际上是正确的。想想你是否真的想失去这些字符。
对于iso-8859-1,您可以执行
replace($x, '[^-ÿ]', '')
但这并不能推广到其他编码。
如果您使用的是Saxon,那么我建议您自定义序列化程序(您可以设置自己的SerializerFactory,它可以创建一个包含您自己的XMLEmitter的管道,它可以对标准XMLEmitter进行子类化,以省略不在所选编码中的字符,而不是转义它们(。
或者,对输出进行后处理(例如使用Perl或Awk(以删除所有数字字符引用。
然而,除此之外,我还要对这一要求提出质疑。你想做的似乎不是一件好事。