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

请求修改XSLT代码:使shipToIdentifier仅输出一次,shipmentAddress可重复

SAP销售订单XSLT处理:解决shipToIdentifier重复输出问题的实现逻辑

核心解决思路

源数据里存在多个addressIdentifier="WE"且lineNumber="000000"的地址节点,导致目标XML中shipToIdentifier重复。解决的关键是把标识符输出和地址列表输出拆分开:只提取一次符合条件的shipToIdentifier,同时完整保留所有对应的shipmentAddress节点。

具体实现步骤

1. 仅输出一次shipToIdentifier

有两种简单的实现方式,任选其一即可:

  • 方式一:用distinct-values取唯一值
    直接提取符合条件节点的addressIdentifier唯一值,确保只输出一次:
<shipToIdentifier>
  <xsl:value-of select="distinct-values(//address[addressIdentifier='WE' and lineNumber='000000']/addressIdentifier)"/>
</shipToIdentifier>
  • 方式二:用分组取首个节点
    通过for-each-group按addressIdentifier和lineNumber分组,只输出每组的第一个标识符:
<xsl:for-each-group select="//address[addressIdentifier='WE' and lineNumber='000000']" group-by="concat(addressIdentifier, lineNumber)">
  <shipToIdentifier>
    <xsl:value-of select="addressIdentifier"/>
  </shipToIdentifier>
</xsl:for-each-group>

2. 完整保留所有shipmentAddress节点

直接遍历所有符合条件的地址节点,原样输出对应的地址结构,不需要去重:

<shipmentAddresses>
  <xsl:for-each select="//address[addressIdentifier='WE' and lineNumber='000000']">
    <shipmentAddress>
      <!-- 复制地址的所有子字段(排除不需要的标识符和行号) -->
      <xsl:copy-of select="*[not(local-name()='addressIdentifier' or local-name()='lineNumber')]"/>
    </shipmentAddress>
  </xsl:for-each>
</shipmentAddresses>

3. 完整逻辑整合示例

把两部分逻辑结合起来,形成完整的转换模板:

<xsl:template match="/">
  <targetSalesOrder>
    <!-- 其他需要转换的节点 -->
    <shipToSection>
      <!-- 输出唯一的shipToIdentifier -->
      <xsl:for-each-group select="//address[addressIdentifier='WE' and lineNumber='000000']" group-by="addressIdentifier">
        <shipToIdentifier>
          <xsl:value-of select="addressIdentifier"/>
        </shipToIdentifier>
      </xsl:for-each-group>
      <!-- 输出所有对应的发货地址 -->
      <shipmentAddresses>
        <xsl:for-each select="//address[addressIdentifier='WE' and lineNumber='000000']">
          <shipmentAddress>
            <xsl:copy-of select="street, city, postalCode, country"/>
            <!-- 或者用*[not(...)]批量复制,根据实际字段调整 -->
          </shipmentAddress>
        </xsl:for-each>
      </shipmentAddresses>
    </shipToSection>
    <!-- 其他需要转换的节点 -->
  </targetSalesOrder>
</xsl:template>

注意事项

  • 如果后续还要处理其他类型的重复标识符问题,分组的方式比distinct-values扩展性更强,更容易复用逻辑
  • 使用xsl:copy-of批量复制字段,比逐个手动映射更高效,也方便后续维护

内容的提问来源于stack exchange,提问作者munireddy pulagam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:57:32