每组订单的每行项目的XSLT

每组订单的每行项目的XSLT,xslt,orders,Xslt,Orders,我是XSLT映射空间的新手,我想就我的转换征求一些专家的意见。我有一个平面XML文件,我希望它按照装运编号及其对应的行项目和行项目编号进行结构化。任何帮助都将不胜感激 这是我的XML <?xml version="1.0" encoding="UTF-8"?> <Orders> <Line_Items> <Delivery_Date>2014-03-25T06:00:00.000+1000</Delivery_Date>

我是XSLT映射空间的新手,我想就我的转换征求一些专家的意见。我有一个平面XML文件,我希望它按照装运编号及其对应的行项目和行项目编号进行结构化。任何帮助都将不胜感激

这是我的XML

<?xml version="1.0" encoding="UTF-8"?>
<Orders>
<Line_Items>
    <Delivery_Date>2014-03-25T06:00:00.000+1000</Delivery_Date>
    <SAP_Order>518748492</SAP_Order>
    <SAP_Delivery>416065495</SAP_Delivery>
    <SAP_Shipment>2653107 - 6:00 AM - R/L</SAP_Shipment>
    <External_ID>BRBC69J250314</External_ID>
    <Time_Slot>1899/12/31</Time_Slot>
    <Customer_Order>R-41542740A</Customer_Order>
    <Outlet_Number>4202629</Outlet_Number>
    <Material>951586</Material>
    <Material_Description>1.25 PET X12 MT FRK LSPK</Material_Description>
    <Order_Qty>48</Order_Qty>
    <Pallets>22</Pallets>
    <Gross_Weight>19329.08</Gross_Weight>
    <Dispatcher_Message>AWH</Dispatcher_Message>
    <Driver_Message>R/L - 1R4228V</Driver_Message>
    <Pallet_Count>22</Pallet_Count>
    <Shipping_Point>1043</Shipping_Point>
</Line_Items>
<Line_Items>
    <Delivery_Date>2014-03-25T06:00:00.000+1000</Delivery_Date>
    <SAP_Order>518748492</SAP_Order>
    <SAP_Delivery>416065495</SAP_Delivery>
    <SAP_Shipment>2653107 - 6:00 AM - R/L</SAP_Shipment>
    <External_ID>BRBC69J250314</External_ID>
    <Time_Slot>1899/12/31</Time_Slot>
    <Customer_Order>R-41542740A</Customer_Order>
    <Outlet_Number>4202629</Outlet_Number>
    <Material>950064</Material>
    <Material_Description>1.25 PET X12 DIET COKE</Material_Description>
    <Order_Qty>192</Order_Qty>
    <Pallets>22</Pallets>
    <Gross_Weight>19329.08</Gross_Weight>
    <Dispatcher_Message>AWH</Dispatcher_Message>
    <Driver_Message>R/L - 1R4228V</Driver_Message>
    <Pallet_Count>22</Pallet_Count>
    <Shipping_Point>1043</Shipping_Point>
</Line_Items>
<Line_Items>
    <Delivery_Date>2014-03-25T09:00:00.000+1000</Delivery_Date>
    <SAP_Order>518748492</SAP_Order>
    <SAP_Delivery>416065496</SAP_Delivery>
    <SAP_Shipment>2653108 - 9:00 AM - R/L</SAP_Shipment>
    <External_ID>BRBC70J250314</External_ID>
    <Time_Slot>1899/12/31</Time_Slot>
    <Customer_Order>R-41542740A</Customer_Order>
    <Outlet_Number>4202629</Outlet_Number>
    <Material>950055</Material>
    <Material_Description>2.0 PET X8 COCA-COLA</Material_Description>
    <Order_Qty>1056</Order_Qty>
    <Pallets>22</Pallets>
    <Gross_Weight>19294.88</Gross_Weight>
    <Dispatcher_Message>AWH</Dispatcher_Message>
    <Driver_Message>R/L - 1R4228C</Driver_Message>
    <Pallet_Count>22</Pallet_Count>
    <Shipping_Point>1043</Shipping_Point>
</Line_Items>
</Orders>

2014-03-25T06:00:00.000+1000
518748492
416065495
2653107-6:00上午-R/L
BRBC69J250314
1899/12/31
R-41542740A
4202629
951586
1.25 PET X12 MT FRK LSPK
48
22
19329.08
啊
R/L-1R4228V
22
1043
2014-03-25T06:00:00.000+1000
518748492
416065495
2653107-6:00上午-R/L
BRBC69J250314
1899/12/31
R-41542740A
4202629
950064
1.25 PET X12健怡可乐
192
22
19329.08
啊
R/L-1R4228V
22
1043
2014-03-25T09:00:00.000+1000
518748492
416065496
2653108-上午9:00-R/L
BRBC70J250314
1899/12/31
R-41542740A
4202629
950055
2.0 PET X8可口可乐
1056
22
19294.88
啊
R/L-1R4228C
22
1043
我希望这是目标XML

<?xml version="1.0"?>       
<WhsDockets>    
    <WhsDocket>
        <Identifier>
            <Reference>2653107 - 6:00 AM - R/L</Reference>
            <DocketType>ORD</DocketType>
        </Identifier>
        <DocketDetail>
            <WarehouseCode>ROC</WarehouseCode>
        </DocketDetail>
        <DocketLines>
            <DocketLine>
                <LineNumber>1</LineNumber>
                <Product>951586</Product>
                <Description>1.25 PET X12 MT FRK LSPK</Description>
                <QuantityFromClientOrder>48</QuantityFromClientOrder>
                <ProductUQ>CAS</ProductUQ>
            </DocketLine>
            <DocketLine>
                <LineNumber>2</LineNumber>
                <Product>950064</Product>
                <Description>1.25 PET X12 DIET COKE</Description>
                <QuantityFromClientOrder>192</QuantityFromClientOrder>
                <ProductUQ>CAS</ProductUQ>
            </DocketLine>
        </DocketLines>
    </WhsDocket>
    <WhsDocket>
        <Identifier>
            <Reference>2653108 - 9:00 AM - R/L</Reference>
            <DocketType>ORD</DocketType>
        </Identifier>
        <DocketDetail>
            <WarehouseCode>ROC</WarehouseCode>
        </DocketDetail>
        <DocketLines>
            <DocketLine>
                <LineNumber>1</LineNumber>
                <Product>950055</Product>
                <Description>2.0 PET X8 COCA-COLA</Description>
                <QuantityFromClientOrder>1056</QuantityFromClientOrder>
                <ProductUQ>CAS</ProductUQ>
            </DocketLine>
        </DocketLines>
    </WhsDocket>
</WhsDockets>

2653107-6:00上午-R/L
作战需求
世界车王争霸赛
1.
951586
1.25 PET X12 MT FRK LSPK
48
中科院
2.
950064
1.25 PET X12健怡可乐
192
中科院
2653108-上午9:00-R/L
作战需求
世界车王争霸赛
1.
950055
2.0 PET X8可口可乐
1056
中科院
但我需要在相同的参考编号下有相应的行项目,并添加行项目编号以区分它,但这就是我得到的

<WhsDocket>
            <Identifier>
                <Reference>2653107 - 6:00 AM - R/L</Reference>
                <DocketType>ORD</DocketType>
            </Identifier>
            <DocketDetail>
                <WarehouseCode>ROC</WarehouseCode>
            </DocketDetail>
            <DocketLines>
                <DocketLine>
                    <Product>951586</Product>
                    <Description>1.25 PET X12 MT FRK LSPK</Description>
                    <QuantityFromClientOrder>48</QuantityFromClientOrder>
                    <ProductUQ>CAS</ProductUQ>
                </DocketLine>
            </DocketLines>
        </WhsDocket>
        <WhsDocket>
            <Identifier>
                <Reference>2653107 - 6:00 AM - R/L</Reference>
                <DocketType>ORD</DocketType>
            </Identifier>
            <DocketDetail>
                <WarehouseCode>ROC</WarehouseCode>
            </DocketDetail>
            <DocketLines>
                <DocketLine>
                    <Product>950064</Product>
                    <Description>1.25 PET X12 DIET COKE</Description>
                    <QuantityFromClientOrder>192</QuantityFromClientOrder>
                    <ProductUQ>CAS</ProductUQ>
                </DocketLine>
            </DocketLines>
        </WhsDocket>
        <WhsDocket>
            <Identifier>
                <Reference>2653108 - 9:00 AM - R/L</Reference>
                <DocketType>ORD</DocketType>
            </Identifier>
            <DocketDetail>
                <WarehouseCode>ROC</WarehouseCode>
            </DocketDetail>
            <DocketLines>
                <DocketLine>
                    <Product>950055</Product>
                    <Description>2.0 PET X8 COCA-COLA</Description>
                    <QuantityFromClientOrder>1056</QuantityFromClientOrder>
                    <ProductUQ>CAS</ProductUQ>
                </DocketLine>
            </DocketLines>
        </WhsDocket>
    </WhsDockets>

2653107-6:00上午-R/L
作战需求
世界车王争霸赛
951586
1.25 PET X12 MT FRK LSPK
48
中科院
2653107-6:00上午-R/L
作战需求
世界车王争霸赛
950064
1.25 PET X12健怡可乐
192
中科院
2653108-上午9:00-R/L
作战需求
世界车王争霸赛
950055
2.0 PET X8可口可乐
1056
中科院
这是我创建的XSLT

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <XmlInterchange xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.edi.com.au/EnterpriseService/">
        <Payload>
            <WhsDockets>
                <xsl:for-each select="Orders/Line_Items">
                    <WhsDocket>
                        <Identifier>
                            <Reference>
                                <xsl:value-of select="SAP_Shipment"/>
                            </Reference>
                            <DocketType>ORD</DocketType>
                        </Identifier>
                        <DocketDetail>
                            <WarehouseCode>ROC</WarehouseCode>
                        </DocketDetail>
                        <DocketLines>
                            <DocketLine>
                                <Product>
                                    <xsl:value-of select="Material"/>
                                </Product>
                                <Description>
                                    <xsl:value-of select="Material_Description"/>
                                </Description>
                                <QuantityFromClientOrder>
                                    <xsl:value-of select="Order_Qty"/>
                                </QuantityFromClientOrder>
                                <ProductUQ>CAS</ProductUQ>
                            </DocketLine>
                        </DocketLines>
                    </WhsDocket>
                </xsl:for-each>
            </WhsDockets>
        </Payload>
    </XmlInterchange>
</xsl:template>
</xsl:stylesheet>

作战需求
世界车王争霸赛
中科院
这是一个“分组”问题,在XSLT1.0中,通常使用的技术称为

首先定义一个键来表示组。在本例中,您是按
SAP\u shipping
元素对
Line\u项目
元素进行分组,因此您可以定义如下键:

<xsl:key name="items" match="Line_Items" use="SAP_Shipment" />
然后,您可以使用以下键获取组中的所有项目(包括第一个项目):

<xsl:apply-templates select="key('items',SAP_Shipment)" />

初学者可以尝试使用此XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:key name="items" match="Line_Items" use="SAP_Shipment" />

    <xsl:template match="Orders">
        <WhsDockets>
            <xsl:for-each select="Line_Items[generate-id() = generate-id(key('items',SAP_Shipment)[1])]">
                <WhsDocket>
                    <Identifier><xsl:value-of select="SAP_Shipment" /></Identifier>
                    <DocketLines>
                        <xsl:apply-templates select="key('items',SAP_Shipment)" />
                    </DocketLines>
                </WhsDocket>
            </xsl:for-each>
        </WhsDockets>
    </xsl:template>

    <xsl:template match="Line_Items">
        <DocketLine>
            <LineNumber><xsl:value-of select="position()" /></LineNumber>
            <Product><xsl:value-of select="Material" /></Product>        
        </DocketLine>
    </xsl:template>
</xsl:stylesheet>


注意:如果您能够使用XSLT2.0,那么您可以为每个组构造使用xsl:for。请参阅。

不太清楚您在问什么。您希望我们对您的XSLT发表评论,还是希望我们修复一些损坏的东西?如果是这样的话,您能否在当前获得(并显示)的输出旁边显示您真正想要的输出?谢谢Abel的评论。我已经编辑了我的目标示例XML。因为我是这方面的初学者。我想知道如何将这些项目分组到一个参考标签下,以及如何获得相应的行项目编号。再次感谢您,祝您有一个愉快的一天。非常感谢Tim提供的详细的有用信息。这将大大加快我的XSLT之旅。我需要完全理解generate-id()是如何工作的。再次感谢你的提示。干杯
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:key name="items" match="Line_Items" use="SAP_Shipment" />

    <xsl:template match="Orders">
        <WhsDockets>
            <xsl:for-each select="Line_Items[generate-id() = generate-id(key('items',SAP_Shipment)[1])]">
                <WhsDocket>
                    <Identifier><xsl:value-of select="SAP_Shipment" /></Identifier>
                    <DocketLines>
                        <xsl:apply-templates select="key('items',SAP_Shipment)" />
                    </DocketLines>
                </WhsDocket>
            </xsl:for-each>
        </WhsDockets>
    </xsl:template>

    <xsl:template match="Line_Items">
        <DocketLine>
            <LineNumber><xsl:value-of select="position()" /></LineNumber>
            <Product><xsl:value-of select="Material" /></Product>        
        </DocketLine>
    </xsl:template>
</xsl:stylesheet>