使用XSLT移除子节点并保留父节点与子节点值的技术问询
解决方案:用XSLT移除嵌套子节点并保留父节点与文本值
我刚好处理过类似的需求,给你一个简洁的XSLT实现方案,完全能满足你的要求:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有未被特殊处理的节点/属性,保证通用性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 专门处理parent节点:保留标签,提取嵌套的value文本 --> <xsl:template match="parent"> <parent> <!-- normalize-space自动去除文本前后的空白,让结果更干净 --> <xsl:value-of select="normalize-space(child/value/text())"/> </parent> </xsl:template> <!-- 直接移除child和value节点,不输出它们 --> <xsl:template match="child|value"/> </xsl:stylesheet>
代码解释:
- 身份模板:这是XSLT里的基础模板,默认会复制所有没有被特殊模板匹配到的节点和属性。如果你的XML还有其他需要保留的结构,这个模板能确保它们不受影响;如果只有示例里的简单结构,也可以去掉这个模板,但保留它会让代码更通用。
- parent节点处理模板:我们重新输出
<parent>标签,然后通过child/value/text()精准定位到需要的文本内容,normalize-space()函数会自动清除文本前后的空格(比如你示例里<value> 123 </value>的空格,处理后会变成干净的123)。 - 移除child/value节点:匹配这两个节点但不做任何输出,相当于直接把它们从结果里剔除。
用这个XSLT处理你给出的输入XML,得到的输出就是:
<parent>123</parent>
如果你的实际XML结构更复杂(比如parent下有多个child/value节点),可以调整select的路径,比如用select="normalize-space(.//value/text())"来提取所有value节点的文本,根据你的实际需求修改即可。
内容的提问来源于stack exchange,提问作者Lucifer
相关产品推荐
相关产品推荐

