
本文介绍如何在 XSLT 转换 HTML 时防止 内部因源 XML 换行符或缩进而产生多余空白和换行,确保每行 精确渲染为独立、紧凑的 ... 结构。
本文介绍如何在 xslt 转换 html 时防止 `` 内部因源 xml 换行符或缩进而产生多余空白和换行,确保每行 `
在使用 XSLT(尤其是 Apache FOP 或现代处理器如 Saxon)将结构化 XML(如含多个
根本原因在于:XSLT 处理器将
✅ 推荐解决方案(XSLT 3.0+)
若使用支持 XSLT 3.0 的处理器(如 Saxon 9.8+、Saxon-HE/PE/EE),最简洁、标准且可维护的方式是启用 suppress-indentation 属性:
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 关键配置:禁止对 span 元素内容自动缩进/换行 -->
<xsl:output method="html" suppress-indentation="span"/>
<xsl:template match="text">
<div>
<span>
<xsl:value-of select="."/>
</span>
</div>
</xsl:template>
</xsl:stylesheet>该设置明确告诉处理器:在序列化 元素时,跳过对其子文本节点的格式化处理(即不插入额外换行与空格),从而确保
⚠️ 兼容性补充说明
- 若受限于 XSLT 1.0/2.0 环境(如旧版 Xalan 或早期 FOP),suppress-indentation 不可用。此时需改用
+ 组合,但注意 normalize-space() 会同时移除首尾空格及中间连续空白——可能破坏需要保留单词间单空格的语义。因此仅建议作为降级方案,并严格测试排版效果。 - 另一种替代方式是显式控制文本节点:用
并为文本节点模板添加 disable-output-escaping="yes"(不推荐,存在安全与可维护性风险)。
? CSS 配合建议
当前 CSS 中 span { white-space: pre; } 是为保留原始空格设计,但若已通过 XSLT 清除了冗余换行,则更合理的做法是:
span {
white-space: nowrap; /* 防止内部换行,符合“每行一 span”语义 */
}
div {
position: absolute;
white-space: nowrap;
border: 1px solid black;
}这既避免 pre 对换行符的过度响应,又确保单行文本不被意外截断。
✅ 总结:优先采用 XSLT 3.0 的 suppress-indentation="span",它是语义清晰、零副作用、W3C 标准的解决方案;升级处理器版本是值得投入的长期优化。










