You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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>

代码说明

  1. 身份模板:作为基础,原样复制所有未被特殊模板匹配的节点,确保XML原有结构和其他未指定节点不受影响。
  2. 空处理:仅匹配没有文本内容的<Name1>,复制节点后将内容替换为同级<Name2>的值。
  3. 替换:精准匹配文本为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:40:58