使用XSLT 1.0更新XML两个节点时遇值追加问题的排查
问题原因与解决方案
问题根源
你遇到的<Item1>新旧值追加问题,是因为处理该节点时没有完全覆盖原有内容,反而同时输出了新值和原节点的文本内容(比如误用<xsl:apply-templates/>保留原文本,又额外添加新值)。
示例XML(假设结构)
<root> <Bank> <Name1></Name1> <Name2>ABC Bank</Name2> </Bank> <Item> <Item1>1235</Item1> <Item2>XYZ</Item2> </Item> </root>
正确的XSLT 1.0实现
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有节点、属性,保证XML结构不变 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理空的<Name1>,将<Name2>的值复制过来 --> <xsl:template match="Name1[not(text())]"> <xsl:copy> <xsl:value-of select="../Name2"/> </xsl:copy> </xsl:template> <!-- 精准匹配值为1235的<Item1>,替换为目标文本 --> <xsl:template match="Item1[text()='1235']"> <xsl:copy> <xsl:text>Item No 1</xsl:text> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 身份模板:作为基础,原样复制所有未被特殊模板匹配的节点,确保XML原有结构和其他未指定节点不受影响。
- 空
处理 :仅匹配没有文本内容的<Name1>,复制节点后将内容替换为同级<Name2>的值。 替换 :精准匹配文本为1235的<Item1>,复制节点后直接输出新文本,完全覆盖原有内容,避免追加。
错误写法示例(导致追加的常见情况)
如果你的代码是类似下面这样,就会触发新旧值追加:
<!-- 错误示例 --> <xsl:template match="Item1"> <xsl:copy> <xsl:text>Item No 1</xsl:text> <xsl:apply-templates/> <!-- 此代码会输出原节点的1235,导致拼接 --> </xsl:copy> </xsl:template>
这种写法中,<xsl:apply-templates/>会输出<Item1>原有的文本内容,所以新值和旧值被拼接在一起,出现Item No 11235的结果。
内容的提问来源于stack exchange,提问作者User_Earth_005
相关产品推荐
相关产品推荐

