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