我需要从>至少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(*)>0]">
<xsl:element name="{name()}"/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>