XSLT:切换行尾自动调整或如何在Windows上产生单个LF字符

问题描述

我写了一个可以在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>&#xd;&#xa;</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="&#xd;&#xa;"
    />
    <xsl:strip-space elements="*" />

    <!-- 3. Define new line as LF only on every platform -->
    <xsl:variable name="NL"><xsl:text>&#xa;</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属性

  1. 在样式表声明中添加以下内容:
xmlns:xalan=http://xml.apache.org/xalan
  1. 然后在模板中添加以下内容:
<xsl:output xalan:line-separator="&#10;" />

选项B:更改$ var

来自:

<xsl:variable name="NL"><xsl:text>&#xd;&#xa;</xsl:text></xsl:variable>

收件人:

<xsl:variable name="NL"><xsl:text>&#xA;</xsl:text></xsl:variable>

您可以在XML编辑器中对其进行测试,该编辑器允许您插入不同的Transformers:Xalan,Saxon,Xsltproc。我用Xalan测试两个选项撒克逊人它产生一致的结果,使您有信心部署到API。(XML和Java是平台无关的。)