2

I want to obtain a better xml file using some xslt and xml below.Please provide XSLT 1.0 support .Thanks a lot.

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

I need to sum up quantity per pallet number and product(see first node below) .Also sequence number is needed in the right part of palletnumber value based on first appearance in the xml.Results should look like :

<?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>
Vishal Pawar
  • 4,324
  • 4
  • 28
  • 54
chopstix21
  • 21
  • 4

1 Answers1

3

Not 100% sure the logic for the new PalletNumber is correct (it's 3:00 AM here), but the following XSLT 1.0 returns the desired output with the given input...

XML Input

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

Output

<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>
Jay
  • 13,803
  • 4
  • 42
  • 69
Daniel Haley
  • 51,389
  • 6
  • 69
  • 95