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

