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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:06:12