2013-02-15 57 views
0

請有人協助我不能爲我的生活弄清楚如何調整我的翻譯文件,以便跟隨的XML隨每個供應商和多個供應商提供多行XML。換句話說,我需要將該文件帶入我們的ERP系統,以便爲xml中的每個供應商創建一個新的採購訂單,但是訂單行相應地按照供應商分組(例如供應商A在xml中有多行)和供應商B具有多條線路的所有那些屬於必須是相同的採購訂單對於A上,並同樣爲B)翻譯文件從xml引入多行

這裏是XML的一個樣本:

<rows> 
<row> 
<SUPPLIER>LIY0001</SUPPLIER> 
<DESTWHS>A4</DESTWHS> 
<RELEASE_DATE>2013-02-14</RELEASE_DATE> 
<DUE_DATE>2013-05-13</DUE_DATE> 
<ITEM>5021616</ITEM> 
<QTY>528</QTY> 
<LINE_ITEM_NO>1</LINE_ITEM_NO> 
<CUST_PO_NO>LIY0001-2013-02-14</CUST_PO_NO> 
<PURCHASEPRICE>5.25</PURCHASEPRICE> 
</row> 
<row> 
<SUPPLIER>LIY0001</SUPPLIER> 
<DESTWHS>A4</DESTWHS> 
<RELEASE_DATE>2013-02-14</RELEASE_DATE> 
<DUE_DATE>2013-05-13</DUE_DATE> 
<ITEM>5021816</ITEM> 
<QTY>222</QTY> 
<LINE_ITEM_NO>2</LINE_ITEM_NO> 
<CUST_PO_NO>LIY0001-2013-02-14</CUST_PO_NO> 
<PURCHASEPRICE>5.90</PURCHASEPRICE> 
</row> 
<row> 
<SUPPLIER>WOR0001</SUPPLIER> 
<DESTWHS>A4</DESTWHS> 
<RELEASE_DATE>2013-02-14</RELEASE_DATE> 
<DUE_DATE>2013-05-13</DUE_DATE> 
<ITEM>650616</ITEM> 
<QTY>129</QTY> 
<LINE_ITEM_NO>9</LINE_ITEM_NO> 
<CUST_PO_NO>WOR0001-2013-02-14</CUST_PO_NO> 
<PURCHASEPRICE>4.46</PURCHASEPRICE> 
</row> 
<row> 
<row> 
<SUPPLIER>WOR0001</SUPPLIER> 
<DESTWHS>A4</DESTWHS> 
<RELEASE_DATE>2013-02-14</RELEASE_DATE> 
<DUE_DATE>2013-05-13</DUE_DATE> 
<ITEM>650610</ITEM> 
<QTY>129</QTY> 
<LINE_ITEM_NO>3</LINE_ITEM_NO> 
<CUST_PO_NO>WOR0001-2013-02-14</CUST_PO_NO> 
<PURCHASEPRICE>3.5</PURCHASEPRICE> 
</row> 
<row> 
</rows> 

下面是翻譯文件我已創建:

<?xml version="1.0" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" encoding="Windows-1252" omit-xml-declaration="yes" /> 
<xsl:template match="/"> 
<PostPurchaseOrders> 
    <Orders> 
     <OrderHeader> 
     <xsl:for-each select = "rows/row"> 
     <CustomerPoNumber><xsl:value-of select="CUST_PO_NO"/></CustomerPoNumber> 
     <Supplier><xsl:value-of select="SUPPLIER"/></Supplier> 
      <OrderDate><xsl:value-of select="RELEASE_DATE"/></OrderDate> 
      <DueDate><xsl:value-of select="DUE_DATE"/></DueDate> 
     <Warehouse><xsl:value-of select="DESTWHS"/></Warehouse> 
    </xsl:for-each> 
    </OrderHeader> 
     <OrderDetails> 
    <xsl:for-each select = "rows/row"> 
     <StockLine> 
     <PurchaseOrderLine><xsl:value-of select="LINE_ITEM_NO"/></PurchaseOrderLine> 
      <StockCode><xsl:value-of select="ITEM"/></StockCode> 
      <Warehouse><xsl:value-of select="DESTWHS"/></Warehouse> 
      <OrderQty><xsl:value-of select="QTY"/></OrderQty> 
      <Price><xsl:value-of select="PURCHASEPRICE"/></Price> 
      </StockLine> 
     </xsl:for-each> 
     </OrderDetails>  
     </Orders> 
<PostPurchaseOrders> 
</xsl:template> 
</xsl:stylesheet> 

任何幫助我如何將我的翻譯文件更改爲循環或其他內容,以便將每個供應商的許多行都納入到一個採購訂單中,我們將不勝感激。

感謝

UPDATE

這裏是什麼,我需要轉化爲我們的ERP系統中的XML:

<PostPurchaseOrder> 
<Orders> 
    <OrderHeader> 
     <Supplier>LIY0001</Supplier> 
     <CustomerPoNumber>example po</CustomerPoNumber> 
     <OrderDate>2013-02-03</OrderDate> 
     <Warehouse>A1</Warehouse> 
    </OrderHeader> 
    <OrderDetails> 
     <StockLine> 
      <PurchaseOrderLine>1</PurchaseOrderLine> 
      <StockCode>12022</StockCode> 
      <OrderQty>10</OrderQty> 
     </StockLine> 
     <StockLine> 
      <PurchaseOrderLine>2</PurchaseOrderLine> 
      <StockCode>15014</StockCode> 
      <OrderQty>15</OrderQty> 
     </StockLine> 
    </OrderDetails> 
</Orders> 
</PostPurchaseOrders> 
+0

你可以添加一個目標XML需要的樣子嗎? – 2013-02-15 13:14:17

+0

Hi @DanielHaley 請參閱上面的要求。我收到的是我身邊的一個xml,但是從我所瞭解的我們的ERP系統可以在多個供應商處獲得的情況下,如果他們只是在新的標題部分中添加了具體細節部分的示例後再繼續。 – 2013-02-17 13:29:17

回答

0

沒有看到你預期的輸出,這是一個有點棘手知道正是你想要,但它確實看起來像你想按供應商分組訂單。對項目進行分組是XSLT中的常見問題,在XSLT1.0中,您使用稱爲Muenchian分組的技術來執行此操作。

如果是分組行由供應商元素,你就開始通過定義以下項:

<xsl:key name="suppliers" match="row" use="SUPPLIER"/> 

然後,爲了獲得不同的供應商,你選擇哪一個先在發生元素爲重點的組使用他們給予供應商

<xsl:apply-templates 
    select="row[generate-id() = generate-id(key('suppliers',SUPPLIER)[1])]" 
    mode="header"/> 

注意使用模式這裏,這是becau在最終的XSLT中,會有兩個模板匹配元素,您需要一種方法來區分它們。

最後,對於每一個「頭」 元素(即與特定供應商的第一次出現元素)你就可以得到組成組像這樣的行:

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

下面是完整的XSLT

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

    <xsl:key name="suppliers" match="row" use="SUPPLIER"/> 

    <xsl:template match="rows"> 
     <PostPurchaseOrders> 
     <xsl:apply-templates select="row[generate-id() = generate-id(key('suppliers',SUPPLIER)[1])]" mode="header"/> 
     </PostPurchaseOrders> 
    </xsl:template> 

    <xsl:template match="row" mode="header"> 
     <Orders> 
     <OrderHeader> 
      <CustomerPoNumber> 
       <xsl:value-of select="CUST_PO_NO"/> 
      </CustomerPoNumber> 
      <Supplier> 
       <xsl:value-of select="SUPPLIER"/> 
      </Supplier> 
      <OrderDate> 
       <xsl:value-of select="RELEASE_DATE"/> 
      </OrderDate> 
      <DueDate> 
       <xsl:value-of select="DUE_DATE"/> 
      </DueDate> 
      <Warehouse> 
       <xsl:value-of select="DESTWHS"/> 
      </Warehouse> 
     </OrderHeader> 
     <OrderDetails> 
      <xsl:apply-templates select="key('suppliers', SUPPLIER)"/> 
     </OrderDetails> 
     </Orders> 
    </xsl:template> 

    <xsl:template match="row"> 
     <StockLine> 
     <PurchaseOrderLine> 
      <xsl:value-of select="LINE_ITEM_NO"/> 
     </PurchaseOrderLine> 
     <StockCode> 
      <xsl:value-of select="ITEM"/> 
     </StockCode> 
     <Warehouse> 
      <xsl:value-of select="DESTWHS"/> 
     </Warehouse> 
     <OrderQty> 
      <xsl:value-of select="QTY"/> 
     </OrderQty> 
     <Price> 
      <xsl:value-of select="PURCHASEPRICE"/> 
     </Price> 
     </StockLine> 
    </xsl:template> 
</xsl:stylesheet> 

當適用於您的XSLT,下面是輸出:

<PostPurchaseOrders> 
    <Orders> 
     <OrderHeader> 
     <CustomerPoNumber>LIY0001-2013-02-14</CustomerPoNumber> 
     <Supplier>LIY0001</Supplier> 
     <OrderDate>2013-02-14</OrderDate> 
     <DueDate>2013-05-13</DueDate> 
     <Warehouse>A4</Warehouse> 
     </OrderHeader> 
     <OrderDetails> 
     <StockLine> 
      <PurchaseOrderLine>1</PurchaseOrderLine> 
      <StockCode>5021616</StockCode> 
      <Warehouse>A4</Warehouse> 
      <OrderQty>528</OrderQty> 
      <Price>5.25</Price> 
     </StockLine> 
     <StockLine> 
      <PurchaseOrderLine>2</PurchaseOrderLine> 
      <StockCode>5021816</StockCode> 
      <Warehouse>A4</Warehouse> 
      <OrderQty>222</OrderQty> 
      <Price>5.90</Price> 
     </StockLine> 
     </OrderDetails> 
    </Orders> 
    <Orders> 
     <OrderHeader> 
     <CustomerPoNumber>WOR0001-2013-02-14</CustomerPoNumber> 
     <Supplier>WOR0001</Supplier> 
     <OrderDate>2013-02-14</OrderDate> 
     <DueDate>2013-05-13</DueDate> 
     <Warehouse>A4</Warehouse> 
     </OrderHeader> 
     <OrderDetails> 
     <StockLine> 
      <PurchaseOrderLine>9</PurchaseOrderLine> 
      <StockCode>650616</StockCode> 
      <Warehouse>A4</Warehouse> 
      <OrderQty>129</OrderQty> 
      <Price>4.46</Price> 
     </StockLine> 
     <StockLine> 
      <PurchaseOrderLine>3</PurchaseOrderLine> 
      <StockCode>650610</StockCode> 
      <Warehouse>A4</Warehouse> 
      <OrderQty>129</OrderQty> 
      <Price>3.5</Price> 
     </StockLine> 
     </OrderDetails> 
    </Orders> 
</PostPurchaseOrders> 
+0

嗨Tim C. 非常感謝你給我一個祝福,並向我彙報。 – 2013-02-19 11:08:46

+0

嗨Tim C 該文件似乎工作完美,但請你可以協助一個調整?除了每個供應商的新訂單外,還必須爲每個倉庫的供應商創建新的訂單。換句話說,來自WOR0001的一個PO用於A4,然後另一個來自WOR0001用於A5?請幫忙。 謝謝 – 2013-02-19 12:08:32

+0

這可能值得問一個全新的問題。你需要的東西當然是可能的,但是需要創建兩個鍵,其中一個鍵是串聯的。 – 2013-02-19 19:43:41