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

如何通过XSLT模板匹配批量更新XML节点值?

需求说明

我需要将以下输入XML中的<Item1>节点值分别更新为BankItem - 1、BankItem - 4、BankItem - 2、BankItem - 5、BankItem - 3。

输入XML

<root>
    <Bank>
        <BankDetail>
            <Name1>BankName</Name1>
            <Name2>TestBank</Name2>
        </BankDetail>
    </Bank>
    <Item>
        <Item1>Text</Item1>
    </Item>
    <Item>
        <Item1>Text</Item1>
    </Item>
    <Item>
        <Item1>Text</Item1>
    </Item>
    <Item>
        <Item1>Text</Item1>
    </Item>
    <Item>
        <Item1>Text</Item1>
    </Item>
</root>

预期输出XML

<root>
    <Bank>
        <BankDetail>
            <Name1>BankName</Name1>
            <Name2>TestBank</Name2>
        </BankDetail>
    </Bank>
    <Item>
        <Item1>BankItem - 1</Item1>
    </Item>
    <Item>
        <Item1>BankItem - 4</Item1>
    </Item>
    <Item>
        <Item1>BankItem - 2</Item1>
    </Item>
    <Item>
        <Item1>BankItem - 5</Item1>
    </Item>
    <Item>
        <Item1>BankItem -  3</Item1>
    </Item>
</root>

我已经通过循环实现了这个功能,但出于学习目的,希望用XSLT的模板匹配(Template Match)方式完成。尝试了以下代码但未成功,恳请提供可行解决方案:

<xsl:template match="root/Item/Item1">
    <xsl:variable name="i" select="position()" />
    
    <xsl:copy>
        <xsl:value-of select="Item1[$i]"/>
    </xsl:copy>
        
    </xsl:template>

解决方案

要实现需求,可借助XSLT的身份模板保留原XML结构,再针对<Item1>节点,根据其父节点<Item>的位置匹配对应目标值。

完整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>

    <!-- 匹配Item1节点,按父节点Item的位置替换值 -->
    <xsl:template match="Item1">
        <xsl:copy>
            <!-- 定义目标值序列,顺序对应第1到第5个Item节点的Item1值 -->
            <xsl:variable name="target-values" select="('BankItem - 1', 'BankItem - 4', 'BankItem - 2', 'BankItem - 5', 'BankItem -  3')"/>
            <!-- 计算当前Item节点在同级Item中的位置 -->
            <xsl:variable name="item-pos" select="count(preceding-sibling::Item) + 1"/>
            <!-- 输出对应位置的目标值 -->
            <xsl:value-of select="$target-values[$item-pos]"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

代码说明

  1. 身份模板:作为XSLT基础模板,负责复制原XML中未被自定义模板匹配的所有节点和属性,确保<Bank>等不需要修改的部分完全保留。
  2. Item1匹配模板:
    • target-values变量存储所有目标替换值,顺序与输入XML中<Item>节点的顺序一一对应。
    • 通过count(preceding-sibling::Item) + 1计算当前<Item>节点在同级节点中的位置,这是区分不同<Item1>的关键。
    • 从target-values中取出对应位置的值,替换原<Item1>的文本内容。

原代码失败原因

  • position()获取的是<Item1>在其父节点<Item>中的位置(始终为1),无法区分不同的<Item>节点。
  • <xsl:value-of select="Item1[$i]"/>上下文错误:当前节点已是<Item1>,此处会查找其下的<Item1>子节点,显然不存在,因此无法输出正确值。

内容的提问来源于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 16:47:03