Removing duplicate elements with XSLT

后端 未结 2 1513
Happy的楠姐
Happy的楠姐 2020-11-29 10:31

I need to eliminate duplicate elements from my XML using a specific node (ItemID)

My XML Looks as follows;


    
        

        
相关标签:
2条回答
  • 2020-11-29 11:07

    I. XSLT 1.0 solution:

    Here is a solution using Muenchian grouping:

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:key name="kLineById" match="Line" use="ItemID|ITEMID"/>
    
     <xsl:template match="node()|@*">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
     </xsl:template>
    
     <xsl:template match=
      "Line[not(generate-id() = generate-id(key('kLineById', ItemID|ITEMID)[1]))]"
      />
    </xsl:stylesheet>
    

    Do Note:

    1. Muenchian grouping is the most efficient known general grouping method for XSLT 1.0.

    2. Pure "push" style used.


    II. XSLT 2.0 solution:

    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="/*">
         <XML>
           <xsl:for-each-group select="Line" group-by="ItemID | ITEMID">
             <xsl:sequence select="."/>
           </xsl:for-each-group>
         </XML>
     </xsl:template>
    </xsl:stylesheet>
    

    Both solutions, when applied on the provided XML document:

    <XML>
            <Line>
                <SupplierID>Waltons</SupplierID>
                <InvoiceID>CAP600795SI</InvoiceID>
                <InvoiceDate>20100506</InvoiceDate>
                <ItemID>723073</ItemID>
                <ColorID>02</ColorID>
                <Description>Pentel LR7 Energel Metal Tip Refill 0.7mm</Description>
                <MainCategory>WRITING INSTRUMENTS</MainCategory>
                <SubCategory>Refill</SubCategory>
                <LineNum>               1.0000000</LineNum>
                <Qty>               6.0000000</Qty>
                <UnitPriceExclTax>              10.0200000</UnitPriceExclTax>
                <LineTax>               8.4200000</LineTax>
                <LinePriceExclTax>              60.1200000</LinePriceExclTax>
                <ColorName>Black</ColorName>
                <UOM>EA</UOM>
                <Backorder>               0.0000000</Backorder>
                <INVENTTRANSID>      CAP5637542_060</INVENTTRANSID>
            </Line>
            <Line>
                <SupplierID>Waltons</SupplierID>
                <InvoiceID>CAP600795SI</InvoiceID>
                <InvoiceDate>20100506</InvoiceDate>
                <ItemID>903420</ItemID>
                <ColorID />
                <Description>STEPHENS JUNIOR Stapler Half Strip KW586</Description>
                <MainCategory>OFFICE SUNDRIES</MainCategory>
                <SubCategory>Staplers</SubCategory>
                <LineNum>               2.0000000</LineNum>
                <Qty>               3.0000000</Qty>
                <UnitPriceExclTax>              32.2500000</UnitPriceExclTax>
                <LineTax>              13.5400000</LineTax>
                <LinePriceExclTax>              96.7500000</LinePriceExclTax>
                <ColorName />
                <UOM>Ea</UOM>
                <Backorder>               0.0000000</Backorder>
                <INVENTTRANSID>      CAP5637547_060</INVENTTRANSID>
            </Line>
            <Line>
                <SupplierID>Waltons</SupplierID>
                <InvoiceID>CAP600795SI</InvoiceID>
                <InvoiceDate>20100506</InvoiceDate>
                <ItemID>867241</ItemID>
                <ColorID />
                <Description>TRODAT PRINTY S/Inking Stamp Copy 4911</Description>
                <MainCategory>STAMPS DATERS NUMBERERS</MainCategory>
                <SubCategory>Self Inking Stamps</SubCategory>
                <LineNum>               3.0000000</LineNum>
                <Qty>               1.0000000</Qty>
                <UnitPriceExclTax>              42.1500000</UnitPriceExclTax>
                <LineTax>               5.9000000</LineTax>
                <LinePriceExclTax>              42.1500000</LinePriceExclTax>
                <ColorName />
                <UOM>Ea</UOM>
                <Backorder>               1.0000000</Backorder>
                <INVENTTRANSID>      CAP5637548_060</INVENTTRANSID>
            </Line>
            <Line>
                <SupplierID>Waltons</SupplierID>
                <InvoiceID>CAP600795SI</InvoiceID>
                <InvoiceDate>20100506</InvoiceDate>
                <ItemID>941151</ItemID>
                <ColorID />
                <Description>PENTEL Correction Tape 5mx5mm ZT35</Description>
                <MainCategory>OFFICE SUNDRIES</MainCategory>
                <SubCategory>Correction Fluid/Pens/Tape</SubCategory>
                <LineNum>               4.0000000</LineNum>
                <Qty>               2.0000000</Qty>
                <UnitPriceExclTax>              25.1500000</UnitPriceExclTax>
                <LineTax>               7.0400000</LineTax>
                <LinePriceExclTax>              50.3000000</LinePriceExclTax>
                <ColorName />
                <UOM>Ea</UOM>
                <Backorder>               0.0000000</Backorder>
                <INVENTTRANSID>      CAP5637549_060</INVENTTRANSID>
            </Line>
            <Line>
                <SupplierID>Waltons</SupplierID>
                <InvoiceID>CAP600795SI</InvoiceID>
                <InvoiceDate>20100506</InvoiceDate>
                <ItemID>801215</ItemID>
                <ColorID />
                <Description>MONDI ROTATRIM Copy Paper A4 80Gsm White</Description>
                <MainCategory>A4 Paper</MainCategory>
                <SubCategory>White Bond Paper</SubCategory>
                <LineNum>               5.0000000</LineNum>
                <Qty>             100.0000000</Qty>
                <UnitPriceExclTax>              29.0100000</UnitPriceExclTax>
                <LineTax>             406.1400000</LineTax>
                <LinePriceExclTax>            2901.0000000</LinePriceExclTax>
                <ColorName />
                <UOM>Pkt 500</UOM>
                <Backorder>               0.0000000</Backorder>
                <INVENTTRANSID>      CAP5637552_060</INVENTTRANSID>
            </Line>
            <Line>
                <SALESID>         CAP716197SO</SALESID>
                <INVOICEID>         CAP600795SI</INVOICEID>
                <INVOICEDATE>2010/05/06</INVOICEDATE>
                <NUMBERSEQUENCEGROUP />
                <LINENUM>               2.0000000</LINENUM>
                <ITEMID>805236</ITEMID>
                <INVENTDIMID>      CAP0000594_061</INVENTDIMID>
                <NAME>Ruled Paper A4 Fnt/Marg JD76</NAME>
                <CONFIRMEDDLV>2010/05/06</CONFIRMEDDLV>
                <INVENTTRANSID>      CAP5637543_060</INVENTTRANSID>
                <QTYSALES>               4.0000000</QTYSALES>
                <QTYORDERED>               4.0000000</QTYORDERED>
                <QTYBACKORDERSALES>               4.0000000</QTYBACKORDERSALES>
                <QTYBACKORDERINVENT>               4.0000000</QTYBACKORDERINVENT>
                <SALESUNIT>EA</SALESUNIT>
                <ORIGSALESID>         CAP716197SO</ORIGSALESID>
                <DATAAREAID>wal</DATAAREAID>
                <RECID>622392608</RECID>
                <RecVersion>1</RecVersion>
            </Line>
            <Line>
                <SALESID>         CAP716197SO</SALESID>
                <INVOICEID>         CAP600795SI</INVOICEID>
                <INVOICEDATE>2010/05/06</INVOICEDATE>
                <NUMBERSEQUENCEGROUP />
                <LINENUM>               3.0000000</LINENUM>
                <ITEMID>941150</ITEMID>
                <INVENTDIMID>      CAP0000594_061</INVENTDIMID>
                <NAME>PENGUIN Correction Fluid 20ml White</NAME>
                <CONFIRMEDDLV>2010/05/06</CONFIRMEDDLV>
                <INVENTTRANSID>      CAP5637546_060</INVENTTRANSID>
                <QTYSALES>               6.0000000</QTYSALES>
                <QTYORDERED>               6.0000000</QTYORDERED>
                <QTYBACKORDERSALES>               6.0000000</QTYBACKORDERSALES>
                <QTYBACKORDERINVENT>               6.0000000</QTYBACKORDERINVENT>
                <SALESUNIT>EA</SALESUNIT>
                <ORIGSALESID>         CAP716197SO</ORIGSALESID>
                <DATAAREAID>wal</DATAAREAID>
                <RECID>622392609</RECID>
                <RecVersion>1</RecVersion>
            </Line>
            <Line>
                <SALESID>         CAP716197SO</SALESID>
                <INVOICEID>         CAP600795SI</INVOICEID>
                <INVOICEDATE>2010/05/06</INVOICEDATE>
                <NUMBERSEQUENCEGROUP />
                <LINENUM>               5.0000000</LINENUM>
                <ITEMID>867241</ITEMID>
                <INVENTDIMID>      CAP0000594_061</INVENTDIMID>
                <NAME>TRODAT PRINTY S/Inking Stamp Copy 4911</NAME>
                <CONFIRMEDDLV>2010/05/06</CONFIRMEDDLV>
                <INVENTTRANSID>      CAP5637548_060</INVENTTRANSID>
                <QTYSALES>               2.0000000</QTYSALES>
                <QTYORDERED>               2.0000000</QTYORDERED>
                <QTYBACKORDERSALES>               1.0000000</QTYBACKORDERSALES>
                <QTYBACKORDERINVENT>               1.0000000</QTYBACKORDERINVENT>
                <SALESUNIT>EA</SALESUNIT>
                <ORIGSALESID>         CAP716197SO</ORIGSALESID>
                <DATAAREAID>wal</DATAAREAID>
                <RECID>622392610</RECID>
                <RecVersion>1</RecVersion>
            </Line>
    </XML>
    

    produce the wanted, correct result:

    <XML>
       <Line>
                <SupplierID>Waltons</SupplierID>
                <InvoiceID>CAP600795SI</InvoiceID>
                <InvoiceDate>20100506</InvoiceDate>
                <ItemID>723073</ItemID>
                <ColorID>02</ColorID>
                <Description>Pentel LR7 Energel Metal Tip Refill 0.7mm</Description>
                <MainCategory>WRITING INSTRUMENTS</MainCategory>
                <SubCategory>Refill</SubCategory>
                <LineNum>               1.0000000</LineNum>
                <Qty>               6.0000000</Qty>
                <UnitPriceExclTax>              10.0200000</UnitPriceExclTax>
                <LineTax>               8.4200000</LineTax>
                <LinePriceExclTax>              60.1200000</LinePriceExclTax>
                <ColorName>Black</ColorName>
                <UOM>EA</UOM>
                <Backorder>               0.0000000</Backorder>
                <INVENTTRANSID>      CAP5637542_060</INVENTTRANSID>
            </Line>
       <Line>
                <SupplierID>Waltons</SupplierID>
                <InvoiceID>CAP600795SI</InvoiceID>
                <InvoiceDate>20100506</InvoiceDate>
                <ItemID>903420</ItemID>
                <ColorID/>
                <Description>STEPHENS JUNIOR Stapler Half Strip KW586</Description>
                <MainCategory>OFFICE SUNDRIES</MainCategory>
                <SubCategory>Staplers</SubCategory>
                <LineNum>               2.0000000</LineNum>
                <Qty>               3.0000000</Qty>
                <UnitPriceExclTax>              32.2500000</UnitPriceExclTax>
                <LineTax>              13.5400000</LineTax>
                <LinePriceExclTax>              96.7500000</LinePriceExclTax>
                <ColorName/>
                <UOM>Ea</UOM>
                <Backorder>               0.0000000</Backorder>
                <INVENTTRANSID>      CAP5637547_060</INVENTTRANSID>
            </Line>
       <Line>
                <SupplierID>Waltons</SupplierID>
                <InvoiceID>CAP600795SI</InvoiceID>
                <InvoiceDate>20100506</InvoiceDate>
                <ItemID>867241</ItemID>
                <ColorID/>
                <Description>TRODAT PRINTY S/Inking Stamp Copy 4911</Description>
                <MainCategory>STAMPS DATERS NUMBERERS</MainCategory>
                <SubCategory>Self Inking Stamps</SubCategory>
                <LineNum>               3.0000000</LineNum>
                <Qty>               1.0000000</Qty>
                <UnitPriceExclTax>              42.1500000</UnitPriceExclTax>
                <LineTax>               5.9000000</LineTax>
                <LinePriceExclTax>              42.1500000</LinePriceExclTax>
                <ColorName/>
                <UOM>Ea</UOM>
                <Backorder>               1.0000000</Backorder>
                <INVENTTRANSID>      CAP5637548_060</INVENTTRANSID>
            </Line>
       <Line>
                <SupplierID>Waltons</SupplierID>
                <InvoiceID>CAP600795SI</InvoiceID>
                <InvoiceDate>20100506</InvoiceDate>
                <ItemID>941151</ItemID>
                <ColorID/>
                <Description>PENTEL Correction Tape 5mx5mm ZT35</Description>
                <MainCategory>OFFICE SUNDRIES</MainCategory>
                <SubCategory>Correction Fluid/Pens/Tape</SubCategory>
                <LineNum>               4.0000000</LineNum>
                <Qty>               2.0000000</Qty>
                <UnitPriceExclTax>              25.1500000</UnitPriceExclTax>
                <LineTax>               7.0400000</LineTax>
                <LinePriceExclTax>              50.3000000</LinePriceExclTax>
                <ColorName/>
                <UOM>Ea</UOM>
                <Backorder>               0.0000000</Backorder>
                <INVENTTRANSID>      CAP5637549_060</INVENTTRANSID>
            </Line>
       <Line>
                <SupplierID>Waltons</SupplierID>
                <InvoiceID>CAP600795SI</InvoiceID>
                <InvoiceDate>20100506</InvoiceDate>
                <ItemID>801215</ItemID>
                <ColorID/>
                <Description>MONDI ROTATRIM Copy Paper A4 80Gsm White</Description>
                <MainCategory>A4 Paper</MainCategory>
                <SubCategory>White Bond Paper</SubCategory>
                <LineNum>               5.0000000</LineNum>
                <Qty>             100.0000000</Qty>
                <UnitPriceExclTax>              29.0100000</UnitPriceExclTax>
                <LineTax>             406.1400000</LineTax>
                <LinePriceExclTax>            2901.0000000</LinePriceExclTax>
                <ColorName/>
                <UOM>Pkt 500</UOM>
                <Backorder>               0.0000000</Backorder>
                <INVENTTRANSID>      CAP5637552_060</INVENTTRANSID>
            </Line>
       <Line>
                <SALESID>         CAP716197SO</SALESID>
                <INVOICEID>         CAP600795SI</INVOICEID>
                <INVOICEDATE>2010/05/06</INVOICEDATE>
                <NUMBERSEQUENCEGROUP/>
                <LINENUM>               2.0000000</LINENUM>
                <ITEMID>805236</ITEMID>
                <INVENTDIMID>      CAP0000594_061</INVENTDIMID>
                <NAME>Ruled Paper A4 Fnt/Marg JD76</NAME>
                <CONFIRMEDDLV>2010/05/06</CONFIRMEDDLV>
                <INVENTTRANSID>      CAP5637543_060</INVENTTRANSID>
                <QTYSALES>               4.0000000</QTYSALES>
                <QTYORDERED>               4.0000000</QTYORDERED>
                <QTYBACKORDERSALES>               4.0000000</QTYBACKORDERSALES>
                <QTYBACKORDERINVENT>               4.0000000</QTYBACKORDERINVENT>
                <SALESUNIT>EA</SALESUNIT>
                <ORIGSALESID>         CAP716197SO</ORIGSALESID>
                <DATAAREAID>wal</DATAAREAID>
                <RECID>622392608</RECID>
                <RecVersion>1</RecVersion>
            </Line>
       <Line>
                <SALESID>         CAP716197SO</SALESID>
                <INVOICEID>         CAP600795SI</INVOICEID>
                <INVOICEDATE>2010/05/06</INVOICEDATE>
                <NUMBERSEQUENCEGROUP/>
                <LINENUM>               3.0000000</LINENUM>
                <ITEMID>941150</ITEMID>
                <INVENTDIMID>      CAP0000594_061</INVENTDIMID>
                <NAME>PENGUIN Correction Fluid 20ml White</NAME>
                <CONFIRMEDDLV>2010/05/06</CONFIRMEDDLV>
                <INVENTTRANSID>      CAP5637546_060</INVENTTRANSID>
                <QTYSALES>               6.0000000</QTYSALES>
                <QTYORDERED>               6.0000000</QTYORDERED>
                <QTYBACKORDERSALES>               6.0000000</QTYBACKORDERSALES>
                <QTYBACKORDERINVENT>               6.0000000</QTYBACKORDERINVENT>
                <SALESUNIT>EA</SALESUNIT>
                <ORIGSALESID>         CAP716197SO</ORIGSALESID>
                <DATAAREAID>wal</DATAAREAID>
                <RECID>622392609</RECID>
                <RecVersion>1</RecVersion>
            </Line>
    </XML>
    
    0 讨论(0)
  • 2020-11-29 11:26

    The following transformation worked for me:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="Line">
            <xsl:copy-of select="." />
        </xsl:template>
        <xsl:template match="/XML">
        <XML>
        <xsl:apply-templates select="Line[not(
            ItemID=preceding-sibling::Line/ItemID or
            ItemID=preceding-sibling::Line/ITEMID or
            ITEMID=preceding-sibling::Line/ItemID or
            ITEMID=preceding-sibling::Line/ITEMID)]" />
        </XML>
    </xsl:template>
    </xsl:transform>
    

    The expression can be simplified, if ItemID / ITEMID was spelled consistently all upper-case or camel-case.

    0 讨论(0)
提交回复
热议问题