xsl用于使用分组和键在一个xml中的多条xml行 [英] xsl for multiple xml lines within one xml using grouping and keys

查看:87
本文介绍了xsl用于使用分组和键在一个xml中的多条xml行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请有人协助创建密钥,以便使用xsl正确地将xml文件分组吗?使用接收到的xml,我需要能够将数据带到我的ERP系统中,从而为每个新供应商以及每个目的地仓库创建一个新的采购订单.换句话说,从下面开始,我需要为LIY0001创建一个采购订单并转到A4(这必须包括与供应商和仓库有关的所有行).类似地,需要为转到A4的WOR0001创建一个新的采购订单,并为转到A5的WOR0001创建一个新的采购订单(同样,与这两个键相关的所有行都这样转到必需的采购订单分组中).对于下面的示例,应该创建3个单独的采购订单.

Please can someone assist with the creation of keys in order to correctly group an xml file using xsl? Using the received xml I need to be able to bring the data into my ERP system whereby a new purchase order is created for each new supplier as well as each destination warehouse. In other words from the below I need a purchase order created for LIY0001 and going to A4 (this must include all lines relevant to both the supplier and warehouse). Similarly a new purchase order needs to be created for WOR0001 going to A4 and another for WOR0001 going to A5 (again with all lines relevant to both keys going to the necessary purchase order grouping as such). For the sample below than there should be 3 separate purchase orders created.

这是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>A5</DESTWHS>
<RELEASE_DATE>2013-02-14</RELEASE_DATE>
<DUE_DATE>2013-05-13</DUE_DATE>
<ITEM>650610</ITEM>
<QTY>129</QTY>
<LINE_ITEM_NO>1</LINE_ITEM_NO>
<CUST_PO_NO>WOR0001-2013-02-14</CUST_PO_NO>
<PURCHASEPRICE>3.5</PURCHASEPRICE>
</row>
<row>
</rows>

这是我创建的翻译文件:

Here is the translation file I have created:

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

在这里,我需要将XML转换为我们的ERP系统:

Here is what I need the xml transformed into for our ERP system:

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

任何有关如何将我的翻译文件更改为2个键进行分组的帮助,将不胜感激,对于每个供应商以及每个目的地仓库,将许多行带入一个采购订单.

Any help as to how I can change my translation file to group for the 2 keys so that many lines are brought into one purchase order for each supplier as well as per destination warehouse would be greatly appreciated.

谢谢

推荐答案

您的XSLT与示例输出之间存在一些不一致之处,因此,我将模拟示例输出.这样就可以实现您要寻找的分组:

There are some inconsistencies between your XSLT and your example output, so I will emulate the example output. This should achieve the grouping you are looking for:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:key name="kOrder" match="row" use="concat(SUPPLIER, '+', DESTWHS)"/>

  <xsl:template match="/*">
    <PostPurchaseOrder>
      <xsl:apply-templates
        select="row[generate-id() = 
                    generate-id(key('kOrder', concat(SUPPLIER, '+', DESTWHS))[1])]"
        mode="group"/>
    </PostPurchaseOrder>
  </xsl:template>

  <xsl:template match="row" mode="group">
    <OrderHeader>
      <Supplier>
        <xsl:value-of select="SUPPLIER" />
      </Supplier>
      <CustomerPoNumber>
        <xsl:value-of select="CUST_PO_NO" />
      </CustomerPoNumber>
      <OrderDate>
        <xsl:value-of select="RELEASE_DATE" />
      </OrderDate>
      <Warehouse>
        <xsl:value-of select="DESTWHS" />
      </Warehouse>
    </OrderHeader>
    <OrderDetails>
      <xsl:apply-templates select="key('kOrder', concat(SUPPLIER, '+', DESTWHS))" />
    </OrderDetails>
  </xsl:template>

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

</xsl:stylesheet>

在示例输入上运行时,将产生:

When run on your sample input, this produces:

<PostPurchaseOrder>
  <OrderHeader>
    <Supplier>LIY0001</Supplier>
    <CustomerPoNumber>LIY0001-2013-02-14</CustomerPoNumber>
    <OrderDate>2013-02-14</OrderDate>
    <Warehouse>A4</Warehouse>
  </OrderHeader>
  <OrderDetails>
    <StockLine>
      <PurchaseOrderLine>1</PurchaseOrderLine>
      <StockCode>5021616</StockCode>
      <OrderQty>528</OrderQty>
    </StockLine>
    <StockLine>
      <PurchaseOrderLine>2</PurchaseOrderLine>
      <StockCode>5021816</StockCode>
      <OrderQty>222</OrderQty>
    </StockLine>
  </OrderDetails>
  <OrderHeader>
    <Supplier>WOR0001</Supplier>
    <CustomerPoNumber>WOR0001-2013-02-14</CustomerPoNumber>
    <OrderDate>2013-02-14</OrderDate>
    <Warehouse>A4</Warehouse>
  </OrderHeader>
  <OrderDetails>
    <StockLine>
      <PurchaseOrderLine>9</PurchaseOrderLine>
      <StockCode>650616</StockCode>
      <OrderQty>129</OrderQty>
    </StockLine>
  </OrderDetails>
  <OrderHeader>
    <Supplier>WOR0001</Supplier>
    <CustomerPoNumber>WOR0001-2013-02-14</CustomerPoNumber>
    <OrderDate>2013-02-14</OrderDate>
    <Warehouse>A5</Warehouse>
  </OrderHeader>
  <OrderDetails>
    <StockLine>
      <PurchaseOrderLine>1</PurchaseOrderLine>
      <StockCode>650610</StockCode>
      <OrderQty>129</OrderQty>
    </StockLine>
  </OrderDetails>
</PostPurchaseOrder>

这篇关于xsl用于使用分组和键在一个xml中的多条xml行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆