我有以下xml结构:
<root>
<a>
<b>
<c>
<c1>123</c1>
<c2>abc</c2>
</c>
<d/>
<e/>
<f/>
</b>
</a>
</root>
如何删除<b>
但将<c>
及其子节点保存在a下,如
<root>
<a>
<c>
<c1>123</c1>
<c2>abc</c2>
</c>
</a>
</root>
答案 0 :(得分:4)
使用带有异常的标识转换。这个额外的模板
<xsl:template match="a/*[not(self::c)]">
匹配一个元素,如果它是a
的子元素,但未命名为“c”。如果是这种情况,则会简单地忽略该元素及其所有内容。
编辑:您已更改了要求,我已更改了代码和输出。现在,b
元素遍历,b
的所有子元素都被忽略,c
除外。
<强>样式表强>
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="b">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="b/*[not(self::c)]"/>
</xsl:transform>
XML输入
<root>
<a>
<b>
<c>
<c1>123</c1>
<c2>abc</c2>
</c>
<d/>
<e/>
<f/>
</b>
</a>
</root>
XMl输出
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a>
<c>
<c1>123</c1>
<c2>abc</c2>
</c>
</a>
</root>
答案 1 :(得分:1)
我想你想做的只是:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="b">
<xsl:apply-templates select="c"/>
</xsl:template>
</xsl:stylesheet>