使用XSLT移除XML空节点与带属性的空节点的转换需求
XSLT移除XML中空节点及带属性空节点的解决方案
先明确你的需求:把包含空节点(包括自闭合空节点、空内容节点、带属性的空节点)的原始XML,转换为只保留非空内容节点的目标XML。
原始XML
<ROOT> <a>this is a </a> <b /> <c> this is c</c> <d></d> <e CSK:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> </ROOT>
期望目标XML
<ROOT> <a>this is a </a> <c> this is c</c> </ROOT>
实现的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:CSK="http://example.com/CSK" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- 身份模板:复制所有未被特殊模板匹配的节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配并移除所有空元素:无有效文本内容且无子元素的元素 --> <xsl:template match="*[not(normalize-space()) and not(*)]"/> </xsl:stylesheet>
代码说明
- 身份模板:这是XSLT的基础模板,作用是原样复制所有未被其他模板匹配到的节点和属性,保证非空节点能被完整保留。
- 空元素移除模板:专门匹配满足两个条件的元素:
- 没有非空白的文本内容(
normalize-space()会去除前后空白,结果为空说明没有有效文本) - 没有任何子元素
不管这些元素有没有附加属性(比如例子里的<e>节点带属性但内容为空),只要符合条件就会被匹配到,模板中没有输出逻辑,相当于直接移除这些空节点。
- 没有非空白的文本内容(
用这个XSLT处理你的原始XML,就能得到你想要的目标结果啦。
内容的提问来源于stack exchange,提问作者Harry S
相关产品推荐
相关产品推荐

