删除空节点以及具有空子节点的节点

时间:2013-06-06 07:54:24

标签: xml xslt xslt-2.0

我正在尝试从源XML中删除空节点。删除空节点已经成功。但我也尝试删除包含空节点的所有节点。

源XML:

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <element>
        <a></a>
        <b>sde</b>
        <c fixedAttr="fixedValue">
            <d>ert</d>
            <e></e>
        </c>
        <f fixedAttr="fixedValue">
            <g></g>
            <h></h>
            <i></i>
        </f>
    </element>
</data>

当前的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>

当前结果:

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <element>
        <b>sde</b>
        <c fixedAttr="fixedValue">
            <d>ert</d>
        </c>
        <f fixedAttr="fixedValue"/>
    </element>
</data>

通缉结果:

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <element>
        <b>sde</b>
        <c fixedAttr="fixedValue">
            <d>ert</d>
        </c>
    </element>
</data>

空父节点<f fixedAttr="fixedValue"/>也需要删除。

2 个答案:

答案 0 :(得分:2)

我没有对它进行过多次测试,但是xslt似乎正在运行。

         

<xsl:template match="node()|@*">
    <xsl:if test="normalize-space(string(.)) != ''">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:if>
</xsl:template>

编辑: 如果你想保留空属性,可以用它完成          

<xsl:template match="node()[normalize-space(string(.)) != '']|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
</xsl:template>

答案 1 :(得分:2)

删除模板中忽略(视为空)的节点父节点:

<xsl:template match="*[not(@*|* |comment()|processing-instruction()) and normalize-space()='']"/>

添加新模板:

<xsl:template match="*[ * and not(*[ @* or * or comment() or processing-instruction() or normalize-space()!='']) ]"/>

仅锁定输入中有子节点但输出中没有子节点的节点。