基于此xml:
<group name="G0">
<group name="G1" />
<group name="G2" />
<group name="G3">
<group name="G3_1" />
<group name="G3_2" />
<group name="G3_3">
<test name="T1" />
<test name="T2" />
<test name="T3" />
</group>
</group>
<group name="G4">
<test name="T4" />
<test name="T5" />
</group>
<group name="G5">
<group name="G5_1">
<group name="G5_1_1" />
<group name="G5_1_2">
<group name="G5_1_2_1">
<test name="T6" />
<test name="T7" />
<test name="T8" />
<test name="T9" />
</group>
</group>
</group>
</group>
</group>
有没有办法删除那些不包含其子元素上的test元素的元素?创建这样的结果。我们的想法是只将包含测试的元素插入到数据库中,但包括有关其父项的信息,以确定测试的来源。 Thankss
<group name="G0">
<group name="G3">
<group name="G3_3">
<test name="T1" />
<test name="T2" />
<test name="T3" />
</group>
</group>
<group name="G4">
<test name="T4" />
<test name="T5" />
</group>
<group name="G5">
<group name="G5_1">
<group name="G5_1_2">
<group name="G5_1_2_1">
<test name="T6" />
<test name="T7" />
<test name="T8" />
<test name="T9" />
</group>
</group>
</group>
</group>
</group>
答案 0 :(得分:3)
修改强>
根据@Tomalak的评论,更简单的方法是对没有孩子的<group>
个节点不做任何事。
<xsl:template match="group[not(*)]" />
其他选项是使用descendant
轴来标识节点。以下模板将检查任何<group>
节点是否具有<test>
作为其后代,并仅在输出中显示它们。
<xsl:template match="group">
<xsl:if test="count(descendant::test) > 0">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:if>
</xsl:template>
以下是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" />
<xsl:strip-space elements="*" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="group[not(*)]" />
</xsl:stylesheet>
输出
<group name="G0">
<group name="G3">
<group name="G3_3">
<test name="T1" />
<test name="T2" />
<test name="T3" />
</group>
</group>
<group name="G4">
<test name="T4" />
<test name="T5" />
</group>
<group name="G5">
<group name="G5_1">
<group name="G5_1_2">
<group name="G5_1_2_1">
<test name="T6" />
<test name="T7" />
<test name="T8" />
<test name="T9" />
</group>
</group>
</group>
</group>
</group>