2015-09-07 154 views
2

我是XSLT Mapping空間的新手,我想問一些關於我的轉換的專家建議。我有一個扁平的XML文件,我希望每個文件都有相應的行項目和行項目編號。任何幫助將不勝感激。每組訂單中的每個訂單項的XSLT

這是我的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> 

我想這是目標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> 

但我必須在相同的參考號對應的行項目,並添加一行項目編號來區分它,但這是我即將得到的。

<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> 

這是我創建的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> 
+0

不太清楚你在問什麼。您是否希望我們對您的XSLT發表評論,或者您是否希望我們修復某些已損壞的內容?如果是這樣,你能顯示你正在獲得(和顯示)的輸出旁邊的輸出嗎? – Abel

+0

感謝Abel您的意見。我編輯了我的目標示例XML。因爲我是這個東西的初學者。我想知道如何將這些項目分組到一個參考標籤下,以及如何獲得相應的訂單項號碼。再次感謝並祝你有美好的一天。 –

回答

1

這是一個「分組」問題,而在XSLT 1.0中,通常使用的技術稱爲Muenchian Grouping

首先定義一個密鑰來表示組。在你的情況是分組由SAP_Shipment元素Line_Items元素,所以你需要定義像這樣的關鍵:

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

您然後選擇第一次出現在keyFor繼續作用的SAP_Shipment其給定值Line_Items元素。這代表每個組

<xsl:for-each select="Line_Items[generate-id() = generate-id(key('items',SAP_Shipment)[1])]"> 

然後就可以拿到小組中的所有項目(包括第一次)開始,使用該密鑰:

<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> 

注意:如果您能夠使用XSLT 2.0,那麼您可以使用xsl:for-each-group構造。見http://www.xml.com/lpt/a/1314

+0

非常感謝Tim提供詳細的幫助。這將大大提升我的XSLT旅程。我需要充分理解generate-id()如何完全工作。再次感謝提示。乾杯! –