请求修改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
相关产品推荐
相关产品推荐

