Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从xml中删除除某些节点之外的所有节点_Xml_Xslt - Fatal编程技术网

从xml中删除除某些节点之外的所有节点

从xml中删除除某些节点之外的所有节点,xml,xslt,Xml,Xslt,我有一个简单的xml文件,如下所示: <?xml version="1.0" encoding="UTF-8"?> <root> <garbage1>something</garbage1> <garbage2>something</garbage2> <garbage3>something</garbage3> <item> <a&g

我有一个简单的xml文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <garbage1>something</garbage1>
    <garbage2>something</garbage2>
    <garbage3>something</garbage3>
    <item>
        <a>
            <b/>
            <c>123</c>
        </a>
        <d>456</d>
    </item>
    <item>
        <a>
            <b/>
            <c>789</c>
        </a>
        <d>666</d>
    </item>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item>
        <c>123</c>
        <d>456</d>
    </item>
    <item>
        <c>789</c>
        <d>666</d>
    </item>
</root>
我想删除除节点和节点内的所有节点,以获得如下结果:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <garbage1>something</garbage1>
    <garbage2>something</garbage2>
    <garbage3>something</garbage3>
    <item>
        <a>
            <b/>
            <c>123</c>
        </a>
        <d>456</d>
    </item>
    <item>
        <a>
            <b/>
            <c>789</c>
        </a>
        <d>666</d>
    </item>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item>
        <c>123</c>
        <d>456</d>
    </item>
    <item>
        <c>789</c>
        <d>666</d>
    </item>
</root>
显然,正确的做法是使用标识转换,然后相应地重写它。如果我只是想删除和,这就可以了:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <!--    identity transformation-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!--    override identity transformation-->
    <xsl:template match="c|d"/>

</xsl:stylesheet>
好的,我只需要否定这个参数,就可以去掉所有不是或的节点。为什么这不起作用

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <!--    identity transformation-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!--    override identity transformation to (apparently not) get rid of all nodes except 'c' and 'd'-->
    <xsl:template match="//*[not(local-name() = ('c', 'd'))]"/>

</xsl:stylesheet>

非常感谢大家,我觉得这里缺少了一些简单的东西…

我找到了一种不同的方法来解决这个问题:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="@*|node()">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:template>

    <xsl:template match="root">
        <root>
            <xsl:apply-templates select="@*|node()"/>
        </root>
    </xsl:template>

    <xsl:template match="item">
        <item>
            <xsl:apply-templates select="@*|node()"/>
        </item>
    </xsl:template>

    <xsl:template match="c | d">
        <xsl:copy-of select="."/>
    </xsl:template>


</xsl:stylesheet>

然而,我最初的想法仍然让我感到困惑,因此如果有人能帮助我,我将非常高兴。

首先,实现以下目标的正确方法:

删除除节点外和节点内的所有节点的步骤

是:

XSLT1.0/2.0

这将匹配项目内部的任何节点,即项目的子代(c和d除外),并将模板应用于其子代,而不复制其自身。因此,例如,a包装被移除,但它的cchild仍然由身份转换模板处理

您的尝试无效,因为第二个模板已应用于根元素。从那里开始,模板没有输出任何内容,也没有应用任何其他模板-因此处理在该点结束,结果为空