首页 > 解决方案 > 如何在订单行内的供应商代码上对 XML 进行分组?

问题描述

我有一个 XML 输入,想通过 xslt 文件为我们的 ERP 系统翻译这个 xml。我想做的是对供应商代码进行分组。因此,我希望每个供应商代码都有 1 个 iorh,而该 iorh 的所有 iorr。

XML 输入:

<NewDataSet>
<OrderLine>
    <SUPPLIER_CODE>01</SUPPLIER_CODE>
    <ITEM_CODE>xxx</ITEM_CODE>
    <ITEM_DESCRIPTION>xxx</ITEM_DESCRIPTION>
    <ORDER_QTY>2.00</ORDER_QTY>
</OrderLine>
<OrderLine>
    <SUPPLIER_CODE>01</SUPPLIER_CODE>
    <ITEM_CODE>yyy</ITEM_CODE>
    <ITEM_DESCRIPTION>yyy</ITEM_DESCRIPTION>
    <ORDER_QTY>3.00</ORDER_QTY>
</OrderLine>
<OrderLine>
    <SUPPLIER_CODE>02</SUPPLIER_CODE>
    <ITEM_CODE>zzz</ITEM_CODE>
    <ITEM_DESCRIPTION>zzz</ITEM_DESCRIPTION>
    <ORDER_QTY>1.00</ORDER_QTY>
</OrderLine>
<OrderLine>
    <SUPPLIER_CODE>02</SUPPLIER_CODE>
    <ITEM_CODE>uuu</ITEM_CODE>
    <ITEM_DESCRIPTION>uuuu</ITEM_DESCRIPTION>
    <ORDER_QTY>2.00</ORDER_QTY>
</OrderLine>
<OrderLine>
    <SUPPLIER_CODE>03</SUPPLIER_CODE>
    <ITEM_CODE>vvv</ITEM_CODE>
    <ITEM_DESCRIPTION>vvv</ITEM_DESCRIPTION>
    <ORDER_QTY>2.00</ORDER_QTY>
</OrderLine>

XSLT:

<?xml version='1.0' ?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:template match="/">
                <DataSet>
                    <xsl:for-each select="NewDataSet/OrderLine">
                        <xsl:sort select="SUPPLIER_CODE"/>
                        <iorh>
                            <iorh.cred_num>
                                <xsl:value-of select="SUPPLIER_CODE"/>
                            </iorh.cred_num>
                            <iorr>
                                <iorr.arti_code>
                                    <xsl:value-of select="ITEM_CODE"/>
                                </iorr.arti_code>
                                <iorr.iorr_oms_1>
                                    <xsl:value-of select="ITEM_CODE"/>
                                </iorr.iorr_oms_1>
                                <iorr.iorr_oms_2>
                                    <xsl:value-of select="ITEM_DESCRIPTION"/>
                                </iorr.iorr_oms_2>
                                <iorr.iorr_order_aantal>
                                    <xsl:value-of select="ORDER_QTY"/>
                                </iorr.iorr_order_aantal>
                            </iorr>
                        </iorh>
                    </xsl:for-each>
                </DataSet>
            </xsl:template>
</xsl:stylesheet>

我想要的 XML 输出:

    <DataSet>
    <iorh> //1x for every SUPPLIER_CODE
        <iorh.cred_num>
        01
        </iorh.cred_num>
    </iorh>
    <iorr>
        <iorr.arti_code>
        xxx
        </iorr.arti_code>
        <iorr.iorr_oms_1>
        xxx
        </iorr.iorr_oms_1>
        <iorr.iorr_oms_2>
        xxx
        </iorr.iorr_oms_2>
        <iorr.iorr_order_aantal>
        2.00
        </iorr.iorr_order_aantal>
    </iorr>
    <iorr>
        <iorr.arti_code>
        yyy
        </iorr.arti_code>
        <iorr.iorr_oms_1>
        yyy
        </iorr.iorr_oms_1>
        <iorr.iorr_oms_2>
        yyy
        </iorr.iorr_oms_2>
        <iorr.iorr_order_aantal>
        3.00
        </iorr.iorr_order_aantal>
    </iorr>
    <iorh> //1x for every SUPPLIER_CODE
        <iorh.cred_num>
        02
        </iorh.cred_num>
    </iorh>
    <iorr>
        <iorr.arti_code>
        vvv
        </iorr.arti_code>
        <iorr.iorr_oms_1>
        vvv
        </iorr.iorr_oms_1>
        <iorr.iorr_oms_2>
        vvv
        </iorr.iorr_oms_2>
        <iorr.iorr_order_aantal>
        2.00
        </iorr.iorr_order_aantal>
    </iorr>
    .....................................
</DataSet>

我现在为每个新的供应商代码/订单行获取一个新的 iorh。谁能告诉/解释我如何做到这一点/有可能做到这一点吗?希望你明白。

标签: xmlxslt

解决方案


用作按供应商xsl:key代码分组的参考。

<xsl:key use="SUPPLIER_CODE" match="/NewDataSet/OrderLine" name="groups"/>
<xsl:template match="/">
    <xsl:apply-templates select="/NewDataSet" />
</xsl:template>
<xsl:template match="/NewDataSet">
    <DataSet>
        <xsl:for-each select="OrderLine[generate-id(.)=generate-id(key('groups',SUPPLIER_CODE))]"> 
            <xsl:sort select="SUPPLIER_CODE"/>
            <iorh>
                <iorh.cred_num>
                    <xsl:value-of select="SUPPLIER_CODE"/>
                </iorh.cred_num>
                <xsl:for-each select="key('groups',SUPPLIER_CODE)">
                    <iorr>
                        <iorr.arti_code>
                            <xsl:value-of select="ITEM_CODE"/>
                        </iorr.arti_code>
                        <iorr.iorr_oms_1>
                            <xsl:value-of select="ITEM_CODE"/>
                        </iorr.iorr_oms_1>
                        <iorr.iorr_oms_2>
                            <xsl:value-of select="ITEM_DESCRIPTION"/>
                        </iorr.iorr_oms_2>
                        <iorr.iorr_order_aantal>
                            <xsl:value-of select="ORDER_QTY"/>
                        </iorr.iorr_order_aantal>
                    </iorr>
                </xsl:for-each>
            </iorh>
        </xsl:for-each>
    <DataSet>
</xsl:template>

推荐阅读