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

请求编写XSLT实现多订单合并(整合订单行至单个订单)

订单行合并XSLT解决方案

需求概述

需要将XML中的多个<ORDER>节点的<LINE>元素合并到第一个<ORDER>节点的<LINES>中,移除其他<ORDER>节点,同时保留原文档的<HEADER>和第一个<ORDER>的所有其他内容。

原始XML

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<TOTHEM>   
  <HEADER>
    <TYPE>INSDES</TYPE>
    <SENDER>me</SENDER>
    <RECEIVER>Them</RECEIVER>
    <DOCUMENT_REFERENCE>
      <ID>5655850111</ID>
      <TIMESTAMP>2022-11-30 11:42:52</TIMESTAMP>
    </DOCUMENT_REFERENCE>   
  </HEADER>   
  <ORDER ID="TO-20402">
    <EXTERNAL_DOCUMENT_NO></EXTERNAL_DOCUMENT_NO>
    <REFERENCE>TO-20402</REFERENCE>
    <ORDER_DATE>30-11-2022</ORDER_DATE>
    <DELIVERY_DATE>30-11-2022</DELIVERY_DATE>
    <PICK_COMMENT></PICK_COMMENT>
    <CARRIER></CARRIER>
    <SHIP>
      <SHIP_ID>me</SHIP_ID>
      <SHIP_NAME>me</SHIP_NAME>
      <SHIP_NAME2></SHIP_NAME2>
      <SHIP_ADDRESS>here</SHIP_ADDRESS>
      <SHIP_ADDRESS2></SHIP_ADDRESS2>
      <SHIP_POSTCODE>8600</SHIP_POSTCODE>
      <SHIP_CITY>Silkeborg</SHIP_CITY>
      <SHIP_COUNTRY_CODE>DK</SHIP_COUNTRY_CODE>
      <SHIP_ATT></SHIP_ATT>
      <SHIP_COMMENT></SHIP_COMMENT>
      <SHIP_MAIL></SHIP_MAIL>
      <SHIP_PHONE_NO></SHIP_PHONE_NO>
      <SHIP_SMS></SHIP_SMS>
    </SHIP>
    <RECEIVE>
      <RECEIVE_ID></RECEIVE_ID>
      <RECEIVE_NAME></RECEIVE_NAME>
      <RECEIVE_ADDRESS></RECEIVE_ADDRESS>
      <RECEIVE_ADDERSS2></RECEIVE_ADDERSS2>
      <RECEIVE_POSTCODE></RECEIVE_POSTCODE>
      <RECEIVE_CITY></RECEIVE_CITY>
      <RECEIVE_COUNTRY_CODE></RECEIVE_COUNTRY_CODE>
      <RECEIVE_CONTACT></RECEIVE_CONTACT>
    </RECEIVE>
    <ORDER_CUSTOM_FIELDS>
      <ORDER_CUSTOM_FIELD1></ORDER_CUSTOM_FIELD1>
      ...
      <ORDER_CUSTOM_FIELD5></ORDER_CUSTOM_FIELD5>
    </ORDER_CUSTOM_FIELDS>
    <LINES>
      <LINE ID="4054009">
        <ARTICLE_NO>260250104</ARTICLE_NO>
        <ARTICLE_EAN>5707644776470</ARTICLE_EAN>
        <ARTICLE_DESCRIPTION></ARTICLE_DESCRIPTION>
        <ARTICLE_DESCRIPTION2></ARTICLE_DESCRIPTION2>
        <ARTICLE_ID>102406528</ARTICLE_ID>
        <QUANTITY>150</QUANTITY>
        <UNIT_OF_MEASURE>Pcs</UNIT_OF_MEASURE>
        <LOT_NO></LOT_NO>
        <EXPIRATION_DATE></EXPIRATION_DATE>
        <LINE_CUSTOM_FIELDS>
          <LINE_CUSTOM_FIELD1></LINE_CUSTOM_FIELD1>
          ...
          <LINE_CUSTOM_FIELD5></LINE_CUSTOM_FIELD5>
        </LINE_CUSTOM_FIELDS>
      </LINE>
    </LINES>   
  </ORDER>   
  <ORDER ID="TO-20403">
    <EXTERNAL_DOCUMENT_NO></EXTERNAL_DOCUMENT_NO>
    <REFERENCE>TO-20403</REFERENCE>
    <ORDER_DATE>30-11-2022</ORDER_DATE>
    <DELIVERY_DATE>30-11-2022</DELIVERY_DATE>
    <PICK_COMMENT></PICK_COMMENT>
    <CARRIER></CARRIER>
    <LINES>
      <LINE ID="4054010">
        <ARTICLE_NO>164800001</ARTICLE_NO>
        <ARTICLE_EAN>5707644835962</ARTICLE_EAN>
        <ARTICLE_DESCRIPTION></ARTICLE_DESCRIPTION>
        <ARTICLE_DESCRIPTION2></ARTICLE_DESCRIPTION2>
        <ARTICLE_ID>102406639</ARTICLE_ID>
        <QUANTITY>500</QUANTITY>
        <UNIT_OF_MEASURE>Pcs</UNIT_OF_MEASURE>
        <LOT_NO></LOT_NO>
        <EXPIRATION_DATE></EXPIRATION_DATE>
        <LINE_CUSTOM_FIELDS>
          <LINE_CUSTOM_FIELD1></LINE_CUSTOM_FIELD1>
          ...
          <LINE_CUSTOM_FIELD5></LINE_CUSTOM_FIELD5>
        </LINE_CUSTOM_FIELDS>
      </LINE>
    </LINES>
   </ORDER>
 </TOTHEM>

期望转换后的XML

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<TOTHEM>   
  <HEADER>
    <TYPE>INSDES</TYPE>
    <SENDER>me</SENDER>
    <RECEIVER>Them</RECEIVER>
    <DOCUMENT_REFERENCE>
      <ID>5655850111</ID>
      <TIMESTAMP>2022-11-30 11:42:52</TIMESTAMP>
    </DOCUMENT_REFERENCE>   
  </HEADER>   
  <ORDER ID="TO-20402">
    <EXTERNAL_DOCUMENT_NO></EXTERNAL_DOCUMENT_NO>
    <REFERENCE>TO-20402</REFERENCE>
    <ORDER_DATE>30-11-2022</ORDER_DATE>
    <DELIVERY_DATE>30-11-2022</DELIVERY_DATE>
    <PICK_COMMENT></PICK_COMMENT>
    <CARRIER></CARRIER>
    <SHIP>
      <SHIP_ID>me</SHIP_ID>
      <SHIP_NAME>me</SHIP_NAME>
      <SHIP_NAME2></SHIP_NAME2>
      <SHIP_ADDRESS>here</SHIP_ADDRESS>
      <SHIP_ADDRESS2></SHIP_ADDRESS2>
      <SHIP_POSTCODE>8600</SHIP_POSTCODE>
      <SHIP_CITY>Silkeborg</SHIP_CITY>
      <SHIP_COUNTRY_CODE>DK</SHIP_COUNTRY_CODE>
      <SHIP_ATT></SHIP_ATT>
      <SHIP_COMMENT></SHIP_COMMENT>
      <SHIP_MAIL></SHIP_MAIL>
      <SHIP_PHONE_NO></SHIP_PHONE_NO>
      <SHIP_SMS></SHIP_SMS>
    </SHIP>
    <RECEIVE>
      <RECEIVE_ID></RECEIVE_ID>
      <RECEIVE_NAME></RECEIVE_NAME>
      <RECEIVE_ADDRESS></RECEIVE_ADDRESS>
      <RECEIVE_ADDERSS2></RECEIVE_ADDERSS2>
      <RECEIVE_POSTCODE></RECEIVE_POSTCODE>
      <RECEIVE_CITY></RECEIVE_CITY>
      <RECEIVE_COUNTRY_CODE></RECEIVE_COUNTRY_CODE>
      <RECEIVE_CONTACT></RECEIVE_CONTACT>
    </RECEIVE>
    <ORDER_CUSTOM_FIELDS>
      <ORDER_CUSTOM_FIELD1></ORDER_CUSTOM_FIELD1>
      ...
      <ORDER_CUSTOM_FIELD5></ORDER_CUSTOM_FIELD5>
    </ORDER_CUSTOM_FIELDS>
    <LINES>
      <LINE ID="4054009">
        <ARTICLE_NO>260250104</ARTICLE_NO>
        <ARTICLE_EAN>5707644776470</ARTICLE_EAN>
        <ARTICLE_DESCRIPTION></ARTICLE_DESCRIPTION>
        <ARTICLE_DESCRIPTION2></ARTICLE_DESCRIPTION2>
        <ARTICLE_ID>102406528</ARTICLE_ID>
        <QUANTITY>150</QUANTITY>
        <UNIT_OF_MEASURE>Pcs</UNIT_OF_MEASURE>
        <LOT_NO></LOT_NO>
        <EXPIRATION_DATE></EXPIRATION_DATE>
        <LINE_CUSTOM_FIELDS>
          <LINE_CUSTOM_FIELD1></LINE_CUSTOM_FIELD1>
          ...
          <LINE_CUSTOM_FIELD5></LINE_CUSTOM_FIELD5>
        </LINE_CUSTOM_FIELDS>
      </LINE>
      <LINE ID="4054010">
        <ARTICLE_NO>164800001</ARTICLE_NO>
        <ARTICLE_EAN>5707644835962</ARTICLE_EAN>
        <ARTICLE_DESCRIPTION></ARTICLE_DESCRIPTION>
        <ARTICLE_DESCRIPTION2></ARTICLE_DESCRIPTION2>
        <ARTICLE_ID>102406639</ARTICLE_ID>
        <QUANTITY>500</QUANTITY>
        <UNIT_OF_MEASURE>Pcs</UNIT_OF_MEASURE>
        <LOT_NO></LOT_NO>
        <EXPIRATION_DATE></EXPIRATION_DATE>
        <LINE_CUSTOM_FIELDS>
          <LINE_CUSTOM_FIELD1></LINE_CUSTOM_FIELD1>
          ...
          <LINE_CUSTOM_FIELD5></LINE_CUSTOM_FIELD5>
        </LINE_CUSTOM_FIELDS>
      </LINE>
    </LINES>
   </ORDER>
 </TOTHEM>

XSLT解决方案

<?xml version="1.0" encoding="utf-8"?>
<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>

  <!-- 处理第一个ORDER节点,替换其LINES内容 -->
  <xsl:template match="ORDER[1]/LINES">
    <LINES>
      <!-- 复制第一个ORDER的所有LINE -->
      <xsl:apply-templates select="../LINES/LINE"/>
      <!-- 复制其他所有ORDER的LINE -->
      <xsl:apply-templates select="../../ORDER[position() > 1]/LINES/LINE"/>
    </LINES>
  </xsl:template>

  <!-- 移除第一个之后的所有ORDER节点 -->
  <xsl:template match="ORDER[position() > 1]"/>
</xsl:stylesheet>

代码说明

  • 默认模板:保留文档中所有未被特殊模板匹配的节点和属性,确保<HEADER>和第一个<ORDER>的其他内容完整保留。
  • LINES替换模板:针对第一个<ORDER>的<LINES>节点,重新生成一个<LINES>,包含第一个<ORDER>自身的所有<LINE>,以及后续所有<ORDER>中的<LINE>。
  • 移除多余ORDER模板:匹配第一个之后的所有<ORDER>节点,不输出任何内容,直接移除这些节点。

内容的提问来源于stack exchange,提问作者Jesper Bloch-Hansen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:50:25