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

如何修改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>

修改说明

  1. 保留XML声明:将<xsl:output>的omit-xml-declaration属性值从yes改为no,确保输出包含XML版本声明,与预期一致。
  2. 移除空属性删除模板:原代码中<xsl:template match="@*[.='']"/>会删除所有空属性,但规则中无此要求,因此移除该模板。
  3. 精准匹配需删除的空元素:新的匹配模板仅删除符合以下所有条件的元素:
    • 不是perm元素;
    • 没有子节点(为空元素);
    • 要么无任何属性,要么attr属性值为a='';b=''。

这样修改后,即可严格按照规则移除空元素,得到预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:07:53