使用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
相关产品推荐
相关产品推荐

