将XML多个元素分组为一个元素

时间:2016-11-09 08:36:50

标签: xml xslt-1.0 xslt-grouping

这是我的XML文件,我们为其编写了一个xsl文件。此xsl的目的是用于XML操作。

输入XML

<ns1:POOrder xmlns:ns1="http://tanole/SO11/ERP_PD_EMS/RD_SalesOrder_Defirm">
    <RIOrder>
        <Order>
           <SerialNo>0922830281</SerialNo>
            <ItemID>2345</ItemID>
            <OrderNo>0128333331</OrderNo>
        </Order>
        <Order>
            <SerialNo>0922830281</SerialNo>
            <ItemID>2345</ItemID>
            <OrderNo>0128333331</OrderNo>
        </Order>
    </RIOrder>
</ns1:POOrder>

预期产出:

<RIOrders>
  <R1 OrderNo="0128333331" ItemID="2345"  SerialNo="0922830281"/>
</RIOrders>

我正在尝试在我的xsl文件中实现这个逻辑,但是无法实现。这就是我目前正在尝试做的事情,我已经尝试了一些事情并且无法找到一种方法来做我需要的事情。 / p>

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:key name="orders" match="Order" use="OrderNo" />
    <xsl:template match="/*">
        <RIOrders>
            <xsl:for-each select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">
                <xsl:apply-templates select="key('orders', OrderNo)" />
            </xsl:for-each>
        </RIOrders>
    </xsl:template>
    <xsl:template match="Order">
        <R1 OrderNo="{OrderNo}" ItemID="{ItemID}" SerialNo="{SerialNo}" UpdateDateOn="N" />
    </xsl:template>
</xsl:stylesheet>

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果您不希望输出中有重复的<Order>元素,请不要将模板应用于组成员,而是应用于组。

您目前“为每个组执行操作,将模板应用于该组的所有元素”:

<xsl:for-each select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">
    <xsl:apply-templates select="key('orders', OrderNo)" />
</xsl:for-each>

然而你真的想这样做:

<xsl:apply-templates select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]" />

您的样本输入的输出是:

<RIOrders>
   <R1 OrderNo="0128333331" ItemID="2345" SerialNo="0922830281" UpdateDateOn="N" />
</RIOrders>

答案 1 :(得分:0)

只是做:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:key name="orders" match="Order" use="OrderNo" />
    <xsl:template match="/*">
        <RIOrders>
            <xsl:for-each select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">
                 <R1 OrderNo="{OrderNo}" ItemID="{ItemID}" SerialNo="{SerialNo}" UpdateDateOn="N" />
            </xsl:for-each>
        </RIOrders>
    </xsl:template>
</xsl:stylesheet>

请注意,您按OrderNo进行分组。其他值(ItemIDSerialNo)将取自组的第一个成员(按文档顺序)。如果组中还有其他值,则它们将丢失。

相关问题