XSLT输出BOM字符在Excel中可见

我的Java EE Web应用程序使用XSLT转换来生成CSV报告。 如果我在XSLT上指定“UTF-16”作为编码(这似乎是处理XML中的重音字符的唯一方法),那么在CSV输出开始时会得到一个字节顺序标记字符

据我所知,这是正确的行为。 问题是,如果CSV在Excel中打开(显示为:þÿ),则此BOM字符可见,但如果在正确的文本编辑器中打开它,则不会显示该字符;)

如何隐藏或忽略此字符,以便在Excel中打开该文件时不可见?

您忘记指定您正在使用的XSLT版本。

如果您使用XSLT 2.0,则可以使用xsl:output元素禁止BOM。 例如…

<xsl:output method="xml" byte-order-mark="no" encoding="UTF-16" indent="yes" omit-xml-declaration="yes" /> 

如果你使用XSLT 1.0呢?

这里有两个选项:

  1. 升级到XSLT 2.0
  2. 升级您的Excel到2007年(请参阅这里为什么)

如果你正在编写一个CSV文件,这个方法应该不像Sean B. Durkin所说的那样是“xml”。

我推荐这个configuration来制作一个能够在Excel中正确打开的CSV文件

 <xsl:output method="text" byte-order-mark="yes" encoding="UTF-16LE" indent="no"/> 

使用XSLT生成CSV时的其他提示:

即使CSV表示“逗号分隔值”,也可以使用TAB字符

我发现我分开的数据往往没有选项卡,但偶尔有逗号。

<xsl:text>&#xa;</xsl:text>是添加换行符的一种方法。

您可能想要避免在使用的值中出现换行符,如下所示:

 <xsl:value-of select="replace($foo,'\n','\\n')"/> 

当然,您会很快注意到,如果您在Excel中打开该文件,它将变成只读文件,这在试图在打开文件时再次生成文件时很麻烦。 不像大多数文本编辑器只是告诉你文件已经改变,并提供重新加载它。

我意识到这个问题已经过时和已经回答了,但我希望这有助于未来的某个人。