使用 XSLT 对没有公共键值的子项进行分组

Grouping the Child with no common key values using XSLT

以下是我的输入XML。这里我有两个不同的 SHOWSHIPMENT 文件,我想将它们合并到一个文件中,使用所有字段和分组中第一次出现 SHOWSHIPMENT 的数据第二个RL_DEATILS变成第一个SHOWSHIPMENT

输入:

 <SHOW>
    <SHOWSHIPMENT>
        <APPLICATIONAREA>
            <SENDER>
                <LOGICALID>ABC</LOGICALID>
            </SENDER>
            <RECEIVERID>220911</RECEIVERID>
        </APPLICATIONAREA>
        <DATAAREA>
            <SHIPMENT>
                <X_DLV_TAB_ITEM>
                    <TYPE>A</TYPE>
                    <TRANSACTION_CODE>RC</TRANSACTION_CODE>
                </X_DLV_TAB_ITEM>
                <X_DLV_TAB>
                    <X_DLV_TAB_ITEM>
                        <TYPE>A</TYPE>
                        <TRANSACTION_CODE>RC</TRANSACTION_CODE>
                        <DELIVERY_ID>46689764</DELIVERY_ID>
                        <NAME>46689764</NAME>
                    </X_DLV_TAB_ITEM>   
                    <RL_DETAILS>
                        <ITEM>ONE</ITEM>
                        <RL_DETAILS_ITEM>
                            <DELIVERY_DETAIL_ID>14460996</DELIVERY_DETAIL_ID>
                            <GROSS_WEIGHT>11</GROSS_WEIGHT>
                            <WEIGHT_UOM_CODE>LB</WEIGHT_UOM_CODE>
                            <VOLUME>0.2</VOLUME>
                            <VOLUME_UOM_CODE>CF</VOLUME_UOM_CODE>
                            <REQUESTED_QUANTITY>5</REQUESTED_QUANTITY>
                        </RL_DETAILS_ITEM>
                    </RL_DETAILS>
                </X_DLV_TAB>
            </SHIPMENT>
        </DATAAREA>
    </SHOWSHIPMENT>
    <SHOWSHIPMENT>
        <APPLICATIONAREA>
            <SENDER>
                <LOGICALID>XYZ</LOGICALID>
            </SENDER>
            <RECEIVERID>220911</RECEIVERID>
        </APPLICATIONAREA>
        <DATAAREA>
            <SHIPMENT>
                <X_DLV_TAB_ITEM>
                    <TYPE>B</TYPE>
                    <TRANSACTION_CODE>AB</TRANSACTION_CODE>
                </X_DLV_TAB_ITEM>
                <X_DLV_TAB>
                    <X_DLV_TAB_ITEM>
                        <TYPE>B</TYPE>
                        <TRANSACTION_CODE>AB</TRANSACTION_CODE>
                        <DELIVERY_ID>466897665</DELIVERY_ID>
                        <NAME>46689765</NAME>
                    </X_DLV_TAB_ITEM>
                    <RL_DETAILS>
                        <ITEM>TWO</ITEM>
                        <RL_DETAILS_ITEM>
                            <DELIVERY_DETAIL_ID>14460997</DELIVERY_DETAIL_ID>
                            <GROSS_WEIGHT>5.28333</GROSS_WEIGHT>
                            <WEIGHT_UOM_CODE>LB</WEIGHT_UOM_CODE>
                            <VOLUME>0.12</VOLUME>
                            <VOLUME_UOM_CODE>CF</VOLUME_UOM_CODE>
                            <REQUESTED_QUANTITY>3</REQUESTED_QUANTITY>
                        </RL_DETAILS_ITEM>
                    </RL_DETAILS>
                </X_DLV_TAB>
            </SHIPMENT>
        </DATAAREA>
    </SHOWSHIPMENT>
 </SHOW>

输出:

 <SHOW>
    <SHOWSHIPMENT>
        <APPLICATIONAREA>
            <SENDER>
                <LOGICALID>ABC</LOGICALID>
            </SENDER>
            <RECEIVERID>220911</RECEIVERID>
        </APPLICATIONAREA>
        <DATAAREA>
            <SHIPMENT>
                <X_DLV_TAB_ITEM>
                    <TYPE>A</TYPE>
                    <TRANSACTION_CODE>RC</TRANSACTION_CODE>
                </X_DLV_TAB_ITEM>
                <X_DLV_TAB>
                    <X_DLV_TAB_ITEM>
                        <TYPE>A</TYPE>
                        <TRANSACTION_CODE>RC</TRANSACTION_CODE>
                        <DELIVERY_ID>46689764</DELIVERY_ID>
                        <NAME>46689764</NAME>
                    </X_DLV_TAB_ITEM>   
                    <RL_DETAILS>
                        <ITEM>ONE</ITEM>
                        <RL_DETAILS_ITEM>
                            <DELIVERY_DETAIL_ID>14460996</DELIVERY_DETAIL_ID>
                            <GROSS_WEIGHT>11</GROSS_WEIGHT>
                            <WEIGHT_UOM_CODE>LB</WEIGHT_UOM_CODE>
                            <VOLUME>0.2</VOLUME>
                            <VOLUME_UOM_CODE>CF</VOLUME_UOM_CODE>
                            <REQUESTED_QUANTITY>5</REQUESTED_QUANTITY>
                        </RL_DETAILS_ITEM>
                    </RL_DETAILS>
                    <RL_DETAILS>
                        <ITEM>TWO</ITEM>
                        <RL_DETAILS_ITEM>
                            <DELIVERY_DETAIL_ID>14460997</DELIVERY_DETAIL_ID>
                            <GROSS_WEIGHT>5.28333</GROSS_WEIGHT>
                            <WEIGHT_UOM_CODE>LB</WEIGHT_UOM_CODE>
                            <VOLUME>0.12</VOLUME>
                            <VOLUME_UOM_CODE>CF</VOLUME_UOM_CODE>
                            <REQUESTED_QUANTITY>3</REQUESTED_QUANTITY>
                        </RL_DETAILS_ITEM>
                    </RL_DETAILS>
                </X_DLV_TAB>
            </SHIPMENT>
        </DATAAREA>
    </SHOWSHIPMENT>
 </SHOW>

SHOWSHIPMENT 中,我 X_DLV_TAB_ITEM 在两个不同的级别重复了两次 SHIPMENT/X_DLV_TAB_ITEMSHIPMENT/X_DLV_TAB/X_DLV_TAB_ITEM.

谢谢玛丽安。

也许我遗漏了什么,但这看起来很简单:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/SHOW">
    <!-- process only 1st SHOWSHIPMENT -->
    <xsl:apply-templates select="SHOWSHIPMENT[1]"/>
</xsl:template>

<xsl:template match="X_DLV_TAB">
    <xsl:copy>
        <xsl:apply-templates/>
        <!-- add RL_DETAILS from 2nd SHOWSHIPMENT -->
        <xsl:apply-templates select="/SHOW/SHOWSHIPMENT[2]/DATAAREA/SHIPMENT/X_DLV_TAB/RL_DETAILS"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>