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"/>也需要被移除。

4

2 回答 2

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>

于 2013-06-06T08:28:09.203 回答
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()!='']) ]"/>

它只锁定在输入中有子节点但在输出中没有子节点的节点。

于 2013-06-06T09:36:33.913 回答