从xml中删除除某些节点之外的所有节点
我有一个简单的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 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仍然由身份转换模板处理 您的尝试无效,因为第二个模板已应用于根元素。从那里开始,模板没有输出任何内容,也没有应用任何其他模板-因此处理在该点结束,结果为空