使用XSLT复制具有至少1个子元素的所有元素

时间:2017-11-29 06:50:55

标签: xml xslt xslt-1.0

我需要从源XML复制具有至少1个子元素的所有节点元素。这样的节点可以存在于任何层级。我想使用 XSLT 执行此操作。

我的输入:

<root>
    <node>
        <node1/>
        <node2/>
        <node3/>
        <node4>
            <node5/>
            <node6/>
        </node4>
        <node7>
            <node8/>
            <node9>
                <node10/>
            </node9>
        </node7>
    </node>
</root>

预期产出:

<root>
    <node/>
    <node4/>
    <node7/>
    <node9/>
</root>

1 个答案:

答案 0 :(得分:0)

您可以通过直接模板匹配以2种方式执行此操作,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">

    <xsl:strip-space elements="*"/>
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <!-- this template copies all the nodes --> 
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <!-- this is an override template to delete nodes without children -->
    <xsl:template match="*[count(*) = 0]"/>

</xsl:stylesheet>

或者,您可以使用子项循环遍历后代并输出其名称,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">

    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="/root">
        <xsl:copy>
            <xsl:for-each select="descendant::*[count(*)&gt;0]">
                <xsl:element name="{name()}"/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>