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

使用XSLT按条件修改元素中的现有值

用XSLT复制XML并修改指定学生的AdmissionNo属性

需求说明

复制XML中所有元素,同时将Name为CDE的学生的AdmissionNo改为989,Name为GHI的学生的AdmissionNo改为765。

输入XML

<College Name="" RoadNo="" BlockNo="" City="" >
<Students>
<Student Name="ABC" AdmissionNo="123" />
<Student Name="CDE" AdmissionNo="456" />
<Student Name="EFG" AdmissionNo="678" />
<Student Name="GHI" AdmissionNo="980" />
<Student Name="IJK" AdmissionNo="767" />
</Students>
</College>

原代码问题

你之前的XSLT用了xsl:copy-of直接复制整个节点,这种方式只能原样复制内容,无法修改节点的属性值。要实现属性修改,需要使用身份模板默认复制所有内容,再针对需要修改的部分单独写匹配模板。

正确的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>

    <!-- 修改Name为CDE的Student的AdmissionNo属性值 -->
    <xsl:template match="Student[@Name='CDE']/@AdmissionNo">
        <xsl:attribute name="AdmissionNo">989</xsl:attribute>
    </xsl:template>

    <!-- 修改Name为GHI的Student的AdmissionNo属性值 -->
    <xsl:template match="Student[@Name='GHI']/@AdmissionNo">
        <xsl:attribute name="AdmissionNo">765</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

代码解释

  1. 身份模板:match="@*|node()"匹配所有属性和节点,通过xsl:copy复制原节点,再用xsl:apply-templates处理子节点/属性,保证默认所有内容都被原样复制。
  2. 属性修改模板:分别匹配特定Student节点下的AdmissionNo属性,替换为目标值。XSLT会优先使用这些匹配模板而非身份模板,从而实现属性修改。

期望输出XML

<College Name="" RoadNo="" BlockNo="" City="" >
<Students>
<Student Name="ABC" AdmissionNo="123" />
<Student Name="CDE" AdmissionNo="989" />
<Student Name="EFG" AdmissionNo="678" />
<Student Name="GHI" AdmissionNo="765" />
<Student Name="IJK" AdmissionNo="767" />
</Students>
</College>

内容的提问来源于stack exchange,提问作者Karna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:23:14