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

XSLT如何合并模板并为指定元素添加已有Number字段

XML转换需求

  • 移除所有节点的mask属性
  • 删除所有节点中的version和status子元素
  • Number字段必须置于Record、element1、element2、element3、element4等元素的最顶部

输入XML

<AllObjects>
    <Objects>
        <Record mask="1234qwer">
            <reference>104006ALS</reference>
            <version>9</version>
            <status>NEW</status>
            <createdTime>2018-06-18T09:37:48.560Z</createdTime>
            <links>
                <link mask="1234qwer12">
                    <reference>112045MS</reference>
                    <version>0</version>
                    <linkReason>Revision</linkReason>
                    <createdDateTime>2018-07-30T10:45:16.870Z</createdDateTime>
                    <lastModifiedDateTime>2018-07-30T10:45:16.870Z</lastModifiedDateTime>
                    <relevantDateTime>2018-07-30T10:45:16.870Z</relevantDateTime>
                    <element1 mask="eqwrwqe12">
                        <reference>17001</reference>
                        <version>1</version>
                    </element1>
                </link>
                <link mask="q0SM9">
                    <reference>109085</reference>
                    <version>0</version>
                    <linkReason>SomeReason</linkReason>
                    <createdDateTime>2018-05-18T10:50:08.520Z</createdDateTime>
                    <lastModifiedDateTime>2018-05-18T10:50:08.520Z</lastModifiedDateTime>
                    <relevantDateTime>2018-05-18T10:50:08.520Z</relevantDateTime>
                    <element2 mask="q0SM934232">
                        <reference>13001</reference>
                        <version>1</version>
                        <conditions>
                            <condition mask="q0SM921312">
                                <reference>9001</reference>
                                <version>1</version>
                                <conditionNumber>1</conditionNumber>
                                <conditionVariations/>
                            </condition>
                        </conditions>
                    </element2>
                </link>
                <link mask="yq0SM92">
                    <reference>109043</reference>
                    <version>0</version>
                    <element3 mask="yJq0SM92">
                        <reference>21006</reference>
                        <version>8</version>
                        <status>NEW</status>
                        <createdDateTime>2018-05-18T10:16:22.430Z</createdDateTime>
                        <links>
                            <link mask="yJq0SM9212">
                                <reference>112193</reference>
                                <version>1</version>
                                <fromDate>2018-07-31</fromDate>
                                <element4 mask="12yJq0SM9">
                                    <reference>26004</reference>
                                    <version>0</version>
                                    <status>NEW</status>
                                    <createdDateTime>2018-08-24T20:46:55.500Z</createdDateTime>
                                </element4>
                            </link>
                        </links>
                    </element3>
                </link>
            </links>
            <Number>999999</Number>
        </Record>
    </Objects>
</AllObjects>

原有XSLT问题说明

  1. 缺少根标签<xsl:stylesheet>的开头部分
  2. 处理目标元素时先输出Number后又调用了全量apply-templates,会导致Number重复输出
  3. element1~element4本身没有Number子元素,无法直接读取到值,需要复用顶层Record的Number值

修正后可用的XSLT代码

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>
  
  <!-- 存储顶层Record的Number值全局复用 -->
  <xsl:variable name="globalNumber" select="/AllObjects/Objects/Record/Number"/>

  <!-- 身份转换模板:默认复制所有节点和属性 -->
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>
  
  <!-- 移除所有mask属性 -->
  <xsl:template match="@mask"/>
  
  <!-- 删除所有version和status元素 -->
  <xsl:template match="version | status"/>
  
  <!-- 处理需要把Number放顶部的元素 -->
  <xsl:template match="Record | element1 | element2 | element3 | element4">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <!-- 输出Number,Record用自身的,其他element用全局变量 -->
      <xsl:choose>
        <xsl:when test="self::Record">
          <xsl:apply-templates select="Number"/>
        </xsl:when>
        <xsl:otherwise>
          <Number><xsl:value-of select="$globalNumber"/></Number>
        </xsl:otherwise>
      </xsl:choose>
      <!-- 匹配除了Number、version、status之外的其他子节点,避免重复输出 -->
      <xsl:apply-templates select="*[not(self::Number or self::version or self::status)]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:24:04