如何用XSLT 1.0合并同FIELD_13值的Ship元素下的LineCharge
XSLT 1.0 实现同FIELD_13的Ship合并并归集所有LineCharge
要解决这个问题,核心是用Muenchian分组(XSLT 1.0中实现分组的标准方法),按FIELD_13的值对Sheet1节点分组,然后为每个分组生成单个Ship,并把分组内所有Sheet1的LineCharge都归集到该Ship的Line节点下。
示例输入XML
假设你的源XML结构如下:
<Root> <Sheet1> <FIELD_13>Ship001</FIELD_13> <LineCharge> <ChargeCode>A</ChargeCode> <Amount>100</Amount> </LineCharge> </Sheet1> <Sheet1> <FIELD_13>Ship001</FIELD_13> <LineCharge> <ChargeCode>B</ChargeCode> <Amount>200</Amount> </LineCharge> </Sheet1> <Sheet1> <FIELD_13>Ship002</FIELD_13> <LineCharge> <ChargeCode>C</ChargeCode> <Amount>150</Amount> </LineCharge> </Sheet1> </Root>
修正后的XSLT 1.0模板
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 定义分组键:按FIELD_13的值分组Sheet1节点 --> <xsl:key name="shipGroup" match="Sheet1" use="FIELD_13"/> <xsl:template match="/Root"> <Shipments> <!-- 遍历每个分组的第一个节点(代表唯一的Ship) --> <xsl:for-each select="Sheet1[generate-id() = generate-id(key('shipGroup', FIELD_13)[1])]"> <Ship> <ShipID> <xsl:value-of select="FIELD_13"/> </ShipID> <Line> <!-- 遍历当前分组内的所有Sheet1节点,输出每个的LineCharge --> <xsl:for-each select="key('shipGroup', FIELD_13)"> <xsl:copy-of select="LineCharge"/> </xsl:for-each> </Line> </Ship> </xsl:for-each> </Shipments> </xsl:template> </xsl:stylesheet>
关键逻辑说明
- Muenchian分组:通过
xsl:key定义分组规则,用generate-id()判断当前节点是否是分组的第一个节点,确保每个FIELD_13值只生成一个Ship。 - 归集LineCharge:在生成
Ship的Line节点时,通过key('shipGroup', FIELD_13)获取当前分组的所有Sheet1节点,逐个复制它们的LineCharge元素,避免丢失任何分组内的Charge数据。
目标输出XML
<Shipments> <Ship> <ShipID>Ship001</ShipID> <Line> <LineCharge> <ChargeCode>A</ChargeCode> <Amount>100</Amount> </LineCharge> <LineCharge> <ChargeCode>B</ChargeCode> <Amount>200</Amount> </LineCharge> </Line> </Ship> <Ship> <ShipID>Ship002</ShipID> <Line> <LineCharge> <ChargeCode>C</ChargeCode> <Amount>150</Amount> </LineCharge> </Line> </Ship> </Shipments>
内容的提问来源于stack exchange,提问作者user3754291
相关产品推荐
相关产品推荐

