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