2012-10-26 23 views
2

我想使用下面的一些xslt和xml 獲得更好的xml文件。請提供XSLT 1.0支持。謝謝了很多。基於多個分組和添加終止的muenchian sum

<!-- entry xml --> 
    <Pallets> 
    <Pallet> 
    <PalletNumber>2</PalletNumber> 
    <Product>1</Product> 
    <Quantity>2</Quantity> 
    </Pallet> 
    <Pallet> 
    <PalletNumber>2</PalletNumber> 
    <Product>1</Product> 
    <Quantity>4</Quantity> 
    </Pallet> 
    <Pallet> 
    <PalletNumber>2</PalletNumber> 
    <Product>2</Product> 
    <Quantity>1</Quantity> 
    </Pallet> 
    <Pallet> 
    <PalletNumber>3</PalletNumber> 
    <Product>1</Product> 
    <Quantity>2</Quantity> 
    </Pallet> 
    <Pallet> 
    <PalletNumber>4</PalletNumber> 
    <Product>2</Product> 
    <Quantity>2</Quantity> 
    </Pallet></Pallets> 

我需要總結每托盤號和產品量(見下面的第一個節點 )。也需要在 palletnumber值的右側部分的序列號基於xml.Results應 第一次出現看起來像:

<?xml version="1.0" encoding="UTF-8"?> 

<!-- upgraded xml --> 
    <Pallets><Pallet> 
    <PalletNumber>2_1</PalletNumber> 
    <Product>1</Product> 
    <Quantity>6</Quantity> 
    </Pallet> 
    <Pallet> 
    <PalletNumber>2_2</PalletNumber> 
    <Product>2</Product> 
    <Quantity>1</Quantity> 
    </Pallet> 
    <Pallet> 
    <PalletNumber>3_1</PalletNumber> 
    <Product>1</Product> 
    <Quantity>2</Quantity> 
    </Pallet> 
    <Pallet> 
    <PalletNumber>4_1</PalletNumber> 
    <Product>2</Product> 
    <Quantity>2</Quantity> 
    </Pallet></Pallets> 
+0

+1雖然你已經嘗試過一個例子一個很好的第一個問題會很好。 –

回答

3

不是100%確定新PalletNumber的邏輯是正確的(這是上午3:00在這裏),但下面的XSLT 1.0返回給定輸入所需的輸出...

XML輸入

<Pallets> 
    <Pallet> 
     <PalletNumber>2</PalletNumber> 
     <Product>1</Product> 
     <Quantity>2</Quantity> 
    </Pallet> 
    <Pallet> 
     <PalletNumber>2</PalletNumber> 
     <Product>1</Product> 
     <Quantity>4</Quantity> 
    </Pallet> 
    <Pallet> 
     <PalletNumber>2</PalletNumber> 
     <Product>2</Product> 
     <Quantity>1</Quantity> 
    </Pallet> 
    <Pallet> 
     <PalletNumber>3</PalletNumber> 
     <Product>1</Product> 
     <Quantity>2</Quantity> 
    </Pallet> 
    <Pallet> 
     <PalletNumber>4</PalletNumber> 
     <Product>2</Product> 
     <Quantity>2</Quantity> 
    </Pallet> 
</Pallets> 

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="kPalletProduct" match="Pallet" use="concat(PalletNumber,'-',Product)"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Pallets"> 
     <xsl:copy> 
      <xsl:for-each select="Pallet[generate-id()=generate-id(key('kPalletProduct',concat(PalletNumber,'-',Product))[1])]"> 
       <xsl:copy> 
        <PalletNumber> 
         <xsl:value-of select="concat(PalletNumber,'_',count(preceding::Pallet[PalletNumber=current()/PalletNumber and not(Product=current()/Product)][1])+1)"/> 
        </PalletNumber> 
        <Product> 
         <xsl:value-of select="Product"/> 
        </Product> 
        <Quantity> 
         <xsl:value-of select="sum(key('kPalletProduct',concat(PalletNumber,'-',Product))/Quantity)"/> 
        </Quantity> 
       </xsl:copy> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

輸出繼電器

<Pallets> 
    <Pallet> 
     <PalletNumber>2_1</PalletNumber> 
     <Product>1</Product> 
     <Quantity>6</Quantity> 
    </Pallet> 
    <Pallet> 
     <PalletNumber>2_2</PalletNumber> 
     <Product>2</Product> 
     <Quantity>1</Quantity> 
    </Pallet> 
    <Pallet> 
     <PalletNumber>3_1</PalletNumber> 
     <Product>1</Product> 
     <Quantity>2</Quantity> 
    </Pallet> 
    <Pallet> 
     <PalletNumber>4_1</PalletNumber> 
     <Product>2</Product> 
     <Quantity>2</Quantity> 
    </Pallet> 
</Pallets>