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

如何用XSL在属性Y为'A'/'B'/'F'时修改属性X的值?

简单XSLT方案:修改指定条件下的XML属性

嘿,我懂你这种平时不怎么碰XML,一碰到XSL就头大的感觉!别担心,咱们用最基础的XSLT写法就能解决你的需求——核心思路就是先原样复制所有XML内容,只对符合条件的元素修改属性,不用搞复杂的语法。

先把你的简化XML补全成带属性的示例(方便演示):

<t6:Catalogue xmlns:t6="http://xxx.yy.com">
  <t6:Items>
    <t6:Item X="old_x_1" Y="A" />
    <t6:Item X="old_x_2" Y="C" />
    <t6:Item X="old_x_3" Y="B" />
    <t6:Item X="old_x_4" Y="F" />
  </t6:Items>
</t6:Catalogue>

接下来是专门针对你需求的XSLT代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:t6="http://xxx.yy.com">
  <!-- 身份模板:原样复制所有节点和属性 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 匹配Y属性为'A'/'B'/'F'的t6:Item元素,修改X属性 -->
  <xsl:template match="t6:Item[@Y='A' or @Y='B' or @Y='F']">
    <xsl:copy>
      <!-- 复制所有原有属性,除了X -->
      <xsl:apply-templates select="@*[name()!='X']"/>
      <!-- 重新设置X属性的值,这里替换成你需要的内容 -->
      <xsl:attribute name="X">new_x_value</xsl:attribute>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

代码说明:

  • 第一个模板是身份模板,是XSLT的基础操作,它会把XML里所有没被特殊匹配的节点/属性原封不动复制下来,这样我们只需要关注要修改的部分。
  • 第二个模板专门匹配Y属性是'A'、'B'或'F'的t6:Item元素:
    1. 先复制这个元素本身
    2. 复制它所有原有属性,但是排除X属性
    3. 重新添加X属性,设置成你需要的新值(把new_x_value换成你的目标值就行)

转换后的输出示例:

<t6:Catalogue xmlns:t6="http://xxx.yy.com">
  <t6:Items>
    <t6:Item Y="A" X="new_x_value" />
    <t6:Item X="old_x_2" Y="C" />
    <t6:Item Y="B" X="new_x_value" />
    <t6:Item Y="F" X="new_x_value" />
  </t6:Items>
</t6:Catalogue>

实用提示:

  • 注意命名空间:你的XML用了t6命名空间,所以XSLT里必须声明完全相同的xmlns:t6="http://xxx.yy.com",不然匹配不到目标元素。
  • 如果你的目标元素不是t6:Item(比如是t6:Mapp?你原来的XML没写完),只需要把模板里的t6:Item改成对应的元素名就行。
  • 运行方式:你可以用免费的在线XML/XSLT转换工具直接测试,或者用Python的lxml库、Java的XSLT处理器这类本地工具批量处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:44:02