使用XSLT将所有元素与至少1个子元素复制



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

我的输入:

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

预期输出:

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

您可以通过直接的模板匹配,如下:

<?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>

相关内容

  • 没有找到相关文章

最新更新