You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XSLT2.0中不移除空格和缩进的前提下删除空行?

移除XML空行同时保留缩进的解决方案

我来帮你搞定这个问题!你需要移除XML中的空行,但要保留元素的缩进和文本内容里的空格,之前的XSLT之所以把输出变成单行,是因为它处理了所有文本节点——包括元素之间用来实现缩进的空白文本,这就把原本的缩进结构也破坏了。

问题根源分析

你之前的XSLT模板匹配了所有text()节点,并用translate去掉了所有换行符:

<xsl:template match="//text()">
  <xsl:value-of select="translate(.,'&#xA;&#xD;', '')"/>
</xsl:template>

这会把元素之间的缩进空白(本质是包含换行和空格的文本节点)也改成无换行的内容,最终导致整个XML变成单行。

正确的XSLT代码

我们只需要移除那些纯空白的文本节点(也就是只包含换行、空格、制表符的节点),同时保留有实际内容的文本节点,再通过XSLT的缩进输出功能来维持结构:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <!-- 开启缩进输出,保证生成带缩进的XML -->
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>

    <!-- 身份模板:复制所有节点和属性,默认行为 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 只移除纯空白的文本节点(空行或仅含空格的行) -->
    <xsl:template match="text()[normalize-space(.) = '']"/>

</xsl:stylesheet>

代码说明

  1. xsl:output的indent="yes":告诉XSLT处理器在输出时自动添加合适的缩进,维持XML的层级结构
  2. 身份模板:负责原样复制所有元素、属性和非空白文本节点,保证内容不丢失
  3. 匹配纯空白文本节点的模板:text()[normalize-space(.) = '']会选中所有只包含空白字符的文本节点,这个模板什么都不输出,就相当于移除了这些空行和多余的纯空白节点

用这个XSLT处理你的输入XML,就能得到你想要的带缩进、无空行的输出结果啦。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:41:45