xsl获取深层嵌套元素

时间:2018-04-17 04:45:16

标签: xml xslt

基于此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>

1 个答案:

答案 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>