问题描述
我写了一个可以在Linux 和 Windows上运行的XSLT。 输出格式必须始终使用CRLF作为行尾。
没有所有额外逻辑的示例:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="utf-8" method="text" indent="no" omit-xml-declaration="yes" xml:space="default"/>
<xsl:strip-space elements="*" />
<xsl:variable name="NL"><xsl:text>
</xsl:text></xsl:variable>
<xsl:template match="/">
<xsl:text>Hello</xsl:text>
<xsl:value-of select="$NL"/>
<xsl:text>World</xsl:text>
</xsl:template>
</xsl:stylesheet>
所需的输出:“ Hello \ r \ nWorld”
尽管在Linux上产生正确的输出,但在Windows上,某些“智能”扩展了“&#xa;”到CRLF(因为这是在Windows上结束的预期行),所以我最终得到“ Hello \ r \ r \ nWorld”。
是否可以关闭对行尾的自动处理? (带有disable-output-escapeing的试验没有成功)
修改:
我们正在使用Xalan 2.7.2处理XSLT
(由于我属于客户的项目,因此无法切换到其他版本的Xalan甚至是Saxon)
使用IntelliJ运行普通脚本将显示相同的结果。因此,我非常确定没有后续的处理步骤会破坏行尾。
摘要:
Xalan选项可以解决问题!谢谢Martin&Fiona。
因此,工作的XSLT看起来像这样。
请注意已注释的三个必要步骤
<!-- 1. Add Xalan namespace -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan">
<!-- 2. Set Xalan option line-separator to fix line endings on every platform -->
<xsl:output encoding="utf-8"
method="text"
indent="no"
omit-xml-declaration="yes"
xml:space="default"
xalan:line-separator="
"
/>
<xsl:strip-space elements="*" />
<!-- 3. Define new line as LF only on every platform -->
<xsl:variable name="NL"><xsl:text>
</xsl:text></xsl:variable>
<xsl:template match="/">
<xsl:text>Hello</xsl:text>
<xsl:value-of select="$NL"/>
<xsl:text>World</xsl:text>
</xsl:template>
</xsl:stylesheet>
解决方法
您可以尝试以下两种方法之一:
选项A:手动设置Xalan XML属性
- 在样式表声明中添加以下内容:
xmlns:xalan=http://xml.apache.org/xalan
- 然后在模板中添加以下内容:
<xsl:output xalan:line-separator=" " />
选项B:更改$ var
来自:
<xsl:variable name="NL"><xsl:text>
</xsl:text></xsl:variable>
收件人:
<xsl:variable name="NL"><xsl:text>
</xsl:text></xsl:variable>
您可以在XML编辑器中对其进行测试,该编辑器允许您插入不同的Transformers:Xalan,Saxon,Xsltproc。我用Xalan测试两个选项撒克逊人它产生一致的结果,使您有信心部署到API。(XML和Java是平台无关的。)