linux - 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>
</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”结尾。
有没有办法关闭行尾的自动处理?(使用 disable-output-escaping 的试验没有成功)
编辑:
我们使用 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>
解决方案
您可以尝试以下两个选项之一:
选项 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 编辑器中对其进行测试,该编辑器允许您插入不同的 Transformer:Xalan、Saxon、Xsltproc。我用 Xalan 测试了两个选项 | 撒克逊人。它产生一致的结果,让您有信心向 API 进行部署。(XML 和 Java 独立于平台。)
推荐阅读
- ruby-on-rails - 使用 AWS S3 和 Activerecord 在 Rails 5.2 中旋转上传的图像
- wordpress - Wordpress - 对能够存储数据的插件的怀疑
- python - list_iterator 垃圾会收集其消耗的值吗?
- mysql - 如何检索所有数据并将最新的数据标记为新数据?
- sql-server - 如何修复错误:更新@tempTable 的字段时的多部分 ID
- android - Android Application Emulator 一直在 React Native 上停止
- database - 使用 cassandara 查询和删除聊天收件箱系统
- php - 如何在codeigniter中获取和返回记录总数
- node.js - 无法从路由调用控制器方法 - Node.js 和 Express.js
- javascript - 如何从json对象中删除双引号