Как мне сгруппировать XML по коду поставщика внутри строки заказа? - PullRequest
1 голос
/ 05 марта 2020

У меня есть XML вход и я хочу перевести это xml для нашей ERP-системы в файл xslt. То, что я хочу сделать, это группировать по коду поставщика. Поэтому я хочу 1 iorh ​​для каждого кода поставщика со всеми iorr для этого iorh.

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. Может кто-нибудь сказать / объяснить мне, как это сделать / возможно ли это сделать? Надеюсь, ты понимаешь.

1 Ответ

0 голосов
/ 05 марта 2020

Используйте 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...