0

従うべきxmlがサプライヤーごとに複数の行と1つのxmlに複数のサプライヤーで取り込まれるように、翻訳ファイルを調整する方法を一生理解できないので、誰か助けてください。つまり、ファイルを ERP システムに取り込む必要があります。これにより、xml 内のサプライヤーごとに新しい発注書が作成されますが、それに応じて注文明細がサプライヤーごとにグループ化されます (たとえば、サプライヤー A には xml とサプライヤーに複数の行があります)。 Bには複数の明細があります。Aに属するすべての明細は、AとBの同じ発注書に含まれている必要があります)

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>   

変換ファイルをループなどに変更して、各サプライヤーの 1 つの注文書に多くの行を含める方法についてのヘルプをいただければ幸いです。

ありがとう

アップデート

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

1 に答える 1

0

期待される出力が表示されない場合、必要なものを正確に把握するのは少し難しいですが、サプライヤごとに注文をグループ化するように見えます。アイテムのグループ化はXSLTの一般的な問題であり、XSLT1.0では、MuenchianGroupingと呼ばれる手法を使用してこれを行います。

要素をサプライヤごとにグループ化する場合は、次のキーを定義することから始めます。

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

次に、個別のサプライヤを取得するには、特定のサプライヤを使用して、キーのグループで最初に出現する行要素を選択します。

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

ここでのモードの使用に注意してください。これは、最終的なXSLTには、要素に一致する2つのテンプレートがあり、それらを区別する方法が必要なためです。

最後に、「ヘッダー」要素(つまり、特定のサプライヤが最初に出現する要素)ごとに、次のようにグループを構成する行を取得できます。

<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>
于 2013-02-17T13:38:52.847 に答える