如何修改XSLT 1.0代码,按规则条件移除XML空元素?
XML空元素移除的XSLT修正方案
移除空元素规则
- perm元素即使为空也必须保留;
- 仅当空元素的attr属性值为
attr="a='';b=''"时,删除该元素; - 无任何属性的空元素需删除。
示例XML
<?xml version="1.0" encoding="UTF-8"?> <item> <perm desc="item_1" attr="a='';b=''"> <content></content> <desc>Item 1</desc> <details> <firstname desc="Name" attr="a='';b=''">John</firstname> <lastname desc="Last" attr="a='';b=''"></lastname> <phone desc="phone" attr="a='';b='561-663-1254'"></phone> </details> </perm> <perm desc="item_2" attr="a='';b=''"></perm> </item>
预期输出XML
<?xml version="1.0" encoding="UTF-8"?> <item> <perm desc="item_1" attr="a='';b=''"> <desc>Item 1</desc> <details> <firstname desc="Name" attr="a='';b=''">John</firstname> <phone desc="phone" attr="a='';b='561-663-1254'"></phone> </details> </perm> <perm desc="item_2" attr="a='';b=''"></perm> </item>
原XSLT代码问题
原代码直接删除所有空元素和空属性,不符合既定规则,无法得到预期结果:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="@*[.='']"/> <xsl:template match="*[not(node())]"/> </xsl:stylesheet>
修改后的XSLT代码
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="no" indent="yes"/> <xsl:strip-space elements="*"/> <!-- 基础身份模板:复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配需要删除的空元素:排除perm,满足无属性或attr值为指定内容 --> <xsl:template match="*[not(self::perm) and not(node()) and (not(@*) or @attr='a='';b=''')]"/> </xsl:stylesheet>
修改说明
- 保留XML声明:将
<xsl:output>的omit-xml-declaration属性值从yes改为no,确保输出包含XML版本声明,与预期一致。 - 移除空属性删除模板:原代码中
<xsl:template match="@*[.='']"/>会删除所有空属性,但规则中无此要求,因此移除该模板。 - 精准匹配需删除的空元素:新的匹配模板仅删除符合以下所有条件的元素:
- 不是perm元素;
- 没有子节点(为空元素);
- 要么无任何属性,要么attr属性值为
a='';b=''。
这样修改后,即可严格按照规则移除空元素,得到预期输出。
内容的提问来源于stack exchange,提问作者Somebody
相关产品推荐
相关产品推荐

