如何使用XSL将首个termVehicleHistory的coverageData复制到其他节点?
解决方法
核心思路是利用XSLT的身份转换模板复制XML的大部分结构,仅对termVehicleHistory节点做特殊处理:
- 保留第一个
termVehicleHistory的所有内容(包括自带的coverageData) - 对后续的
termVehicleHistory,先复制原节点内的所有子节点,再将第一个termVehicleHistory下的所有coverageData节点追加进去
完整XSLT代码
<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> <!-- 匹配第一个termVehicleHistory节点,直接保留原内容 --> <xsl:template match="termVehicleHistory[1]"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配后续的termVehicleHistory节点,追加第一个节点的coverageData --> <xsl:template match="termVehicleHistory[position() > 1]"> <xsl:copy> <!-- 复制当前节点的原有子节点 --> <xsl:apply-templates select="@*|node()"/> <!-- 插入第一个termVehicleHistory下的所有coverageData --> <xsl:copy-of select="/root//termVehicleHistory[1]/coverageData"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
示例输入XML
<root> <termVehicleHistory> <vehicleInfo>Car 1</vehicleInfo> <coverageData> <coverageType>Collision</coverageType> <limit>100000</limit> </coverageData> <coverageData> <coverageType>Comprehensive</coverageType> <limit>50000</limit> </coverageData> </termVehicleHistory> <termVehicleHistory> <vehicleInfo>Car 2</vehicleInfo> </termVehicleHistory> <termVehicleHistory> <vehicleInfo>Car 3</vehicleInfo> </termVehicleHistory> </root>
预期输出XML
<root> <termVehicleHistory> <vehicleInfo>Car 1</vehicleInfo> <coverageData> <coverageType>Collision</coverageType> <limit>100000</limit> </coverageData> <coverageData> <coverageType>Comprehensive</coverageType> <limit>50000</limit> </coverageData> </termVehicleHistory> <termVehicleHistory> <vehicleInfo>Car 2</vehicleInfo> <coverageData> <coverageType>Collision</coverageType> <limit>100000</limit> </coverageData> <coverageData> <coverageType>Comprehensive</coverageType> <limit>50000</limit> </coverageData> </termVehicleHistory> <termVehicleHistory> <vehicleInfo>Car 3</vehicleInfo> <coverageData> <coverageType>Collision</coverageType> <limit>100000</limit> </coverageData> <coverageData> <coverageType>Comprehensive</coverageType> <limit>50000</limit> </coverageData> </termVehicleHistory> </root>
内容的提问来源于stack exchange,提问作者user6186585
相关产品推荐
相关产品推荐

