XSLT:自动行尾调整开关。或者如何在 Windows 上生成单个 LF 字符
XSLT: Switch of automatic line ending adjustment. Or how to produce a single LF character on Windows
我写了一个 XSLT,应该 运行 在 Linux 和 Windows 上。
输出格式必须始终使用 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 上一些“情报”扩展了 '
'到 CRLF(因为这是以 Windows 结尾的预期行),所以我以“Hello\r\r\nWorld”结束。
有没有办法关闭行尾的自动处理?
(禁用输出转义的试验没有成功)
编辑:
我们使用 Xalan 2.7.2 来处理 XSLT
(因为我在客户的项目中,所以我无法切换到另一个版本的 Xalan 甚至 Saxon)
运行 使用 IntelliJ 的纯脚本将显示相同的结果。因此,我很确定没有后续处理步骤会破坏我的行结尾。
总结:
Xalan 选项成功了!谢谢马丁和菲奥娜。
所以工作 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>
您可以尝试以下两个选项之一:
Option A: Manually set the Xalan XML property
- add below in the stylesheet declaration:
xmlns:xalan=http://xml.apache.org/xalan
- then add below in the template:
<xsl:output xalan:line-separator=" " />
Option B: Change the $var
from:
<xsl:variable name="NL"><xsl:text>
</xsl:text></xsl:variable>
to:
<xsl:variable name="NL"><xsl:text>
</xsl:text></xsl:variable>
您可以在 XML 编辑器中测试它,它允许您插入不同的变形金刚:Xalan、Saxon、Xsltproc。我用 Xalan | 测试了两个选项撒克逊人。它产生一致的结果,让您有信心向 API 部署。(XML 和 Java 与平台无关。)
我写了一个 XSLT,应该 运行 在 Linux 和 Windows 上。 输出格式必须始终使用 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 上一些“情报”扩展了 ' '到 CRLF(因为这是以 Windows 结尾的预期行),所以我以“Hello\r\r\nWorld”结束。
有没有办法关闭行尾的自动处理? (禁用输出转义的试验没有成功)
编辑:
我们使用 Xalan 2.7.2 来处理 XSLT
(因为我在客户的项目中,所以我无法切换到另一个版本的 Xalan 甚至 Saxon)
运行 使用 IntelliJ 的纯脚本将显示相同的结果。因此,我很确定没有后续处理步骤会破坏我的行结尾。
总结:
Xalan 选项成功了!谢谢马丁和菲奥娜。
所以工作 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>
您可以尝试以下两个选项之一:
Option A: Manually set the Xalan XML property
- add below in the stylesheet declaration:
xmlns:xalan=http://xml.apache.org/xalan
- then add below in the template:
<xsl:output xalan:line-separator=" " />
Option B: Change the $var
from:
<xsl:variable name="NL"><xsl:text>
</xsl:text></xsl:variable>
to:
<xsl:variable name="NL"><xsl:text>
</xsl:text></xsl:variable>
您可以在 XML 编辑器中测试它,它允许您插入不同的变形金刚:Xalan、Saxon、Xsltproc。我用 Xalan | 测试了两个选项撒克逊人。它产生一致的结果,让您有信心向 API 部署。(XML 和 Java 与平台无关。)