如何在XSLT2.0中不移除空格和缩进的前提下删除空行?
移除XML空行同时保留缩进的解决方案
我来帮你搞定这个问题!你需要移除XML中的空行,但要保留元素的缩进和文本内容里的空格,之前的XSLT之所以把输出变成单行,是因为它处理了所有文本节点——包括元素之间用来实现缩进的空白文本,这就把原本的缩进结构也破坏了。
问题根源分析
你之前的XSLT模板匹配了所有text()节点,并用translate去掉了所有换行符:
<xsl:template match="//text()"> <xsl:value-of select="translate(.,'

', '')"/> </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>
代码说明
xsl:output的indent="yes":告诉XSLT处理器在输出时自动添加合适的缩进,维持XML的层级结构- 身份模板:负责原样复制所有元素、属性和非空白文本节点,保证内容不丢失
- 匹配纯空白文本节点的模板:
text()[normalize-space(.) = '']会选中所有只包含空白字符的文本节点,这个模板什么都不输出,就相当于移除了这些空行和多余的纯空白节点
用这个XSLT处理你的输入XML,就能得到你想要的带缩进、无空行的输出结果啦。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

