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

使用XSLT 1.0替换XML中关联唯一标识的AddressRef元素

使用XSLT 1.0替换关联的AddressRef元素

你需要根据AllAddressRef中UniqueID的值匹配Employee下的AddressRef元素,并将其替换为指定的Address元素。下面是适配XSLT 1.0的解决方案:

原始XML输入(已修正语法错误)

<?xml version="1.0"?>
<Company>
  <Employee>
    <FirstName>Tanmay</FirstName>
    <LastName>Patil</LastName>
    <ContactNo>1234567890</ContactNo>
    <Email>tanmaypatil@xyz.com</Email>
    <AddressRef>0123321</AddressRef>
    <AllAddressRef>
      <AddressRef>
        <UniqueID>0123321</UniqueID>
        <Streetno>6</Streetno>
        <Street>Athol Park</Street>
        <State>WA</State>
        <Country>AU</Country>
      </AddressRef>
    </AllAddressRef>
  </Employee>
</Company>

目标替换效果

需要将匹配的<AddressRef>0123321</AddressRef>替换为:

<Address>
  <Streetno>6</Streetno>
  <Street>Athol Park</Street>
  <State>WA</State>
  <Country>AU</Country>
</Address>

XSLT 1.0解决方案

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 定义索引,通过UniqueID快速定位对应的地址节点 -->
  <xsl:key name="address-by-id" match="AllAddressRef/AddressRef" use="UniqueID"/>

  <!-- 身份模板:默认复制所有节点与属性,保证非目标节点内容不变 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 专门处理Employee下的AddressRef节点 -->
  <xsl:template match="Employee/AddressRef">
    <!-- 通过索引查找匹配的地址节点 -->
    <xsl:variable name="matched-address" select="key('address-by-id', .)"/>
    <!-- 找到匹配项时生成目标Address元素 -->
    <xsl:if test="$matched-address">
      <Address>
        <!-- 复制地址节点中除UniqueID外的所有子元素 -->
        <xsl:apply-templates select="$matched-address/*[not(self::UniqueID)]"/>
      </Address>
    </xsl:if>
    <!-- 可选:若未找到匹配,取消下方注释可保留原AddressRef节点 -->
    <!-- <xsl:if test="not($matched-address)">
      <xsl:copy-of select="."/>
    </xsl:if> -->
  </xsl:template>
</xsl:stylesheet>

代码说明

  • 索引定义:xsl:key创建了一个以UniqueID值为键的索引,关联对应的AllAddressRef/AddressRef节点,这是XSLT 1.0中高效处理关联匹配的常用方式。
  • 身份模板:作为XSLT的基础模板,确保输入XML中除了我们需要修改的部分,其余内容完全保留原样。
  • 目标节点处理:专门匹配Employee下的AddressRef,通过key()函数快速找到关联的地址节点,生成指定的Address元素并复制所需子节点;若未找到匹配,可选择保留原节点或不输出。

最终输出结果

应用上述XSLT后,输出的XML为:

<?xml version="1.0" encoding="UTF-8"?>
<Company>
  <Employee>
    <FirstName>Tanmay</FirstName>
    <LastName>Patil</LastName>
    <ContactNo>1234567890</ContactNo>
    <Email>tanmaypatil@xyz.com</Email>
    <Address>
      <Streetno>6</Streetno>
      <Street>Athol Park</Street>
      <State>WA</State>
      <Country>AU</Country>
    </Address>
    <AllAddressRef>
      <AddressRef>
        <UniqueID>0123321</UniqueID>
        <Streetno>6</Streetno>
        <Street>Athol Park</Street>
        <State>WA</State>
        <Country>AU</Country>
      </AddressRef>
    </AllAddressRef>
  </Employee>
</Company>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:22:21