XML XSLT转换:将子节点地址元素归组到Address父节点
解决方案:批量将child节点内的地址元素包裹到Address父节点
以下是实现需求的XSLT代码,它会保留原XML的所有结构,仅对每个child节点内的地址相关元素进行重组:
<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> <!-- 处理child节点的自定义模板 --> <xsl:template match="child"> <xsl:copy> <!-- 先复制child下所有非地址类型的子元素 --> <xsl:apply-templates select="*[not(local-name()='AddressLine1' or local-name()='AddressLine2' or local-name()='City' or local-name()='Postcode')]"/> <!-- 创建Address父节点,并将所有地址元素移入 --> <Address> <xsl:apply-templates select="AddressLine1 | AddressLine2 | City | Postcode"/> </Address> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 身份模板:作为基础规则,会原样复制XML中所有未被自定义模板匹配的节点、属性和文本,保证原结构(如
root、id、name以及child下的a/b/c元素)完全保留。 - child节点模板:
- 先复制
child下所有不属于地址范畴的子元素(即排除AddressLine1、AddressLine2、City、Postcode); - 生成
<Address>父节点,再将child下的四个地址元素复制到该节点内部,完成重组。
- 先复制
- 批量处理支持:模板会匹配XML中所有的
child节点,不管数量多少,都会逐个处理。
验证效果
将上述XSLT与你提供的原XML结合转换后,会生成你预期的目标XML结构,每个child内的地址元素都会被正确包裹到<Address>节点中。
内容的提问来源于stack exchange,提问作者Harry S
相关产品推荐
相关产品推荐

