使用 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_ITEM 和 SHIPMENT/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>
以下是我的输入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_ITEM 和 SHIPMENT/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>