xml 使用 XSLT 删除重复元素
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10912544/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Removing duplicate elements with XSLT
提问by M3mPh1z
I need to eliminate duplicate elements from my XML using a specific node (ItemID)
我需要使用特定节点 (ItemID) 从我的 XML 中消除重复元素
My XML Looks as follows;
我的 XML 如下所示;
<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>
You will see the XML is not identical but the tag is always in the same place, and there is currently 1 duplicate 867241
您会看到 XML 不相同,但标签始终在同一个位置,并且当前有 1 个重复 867241
I do not want the order to change, just the element removed.
我不想改变顺序,只是删除了元素。
Desired output would be;
期望的输出是;
<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>
I can use XSLT 1 or 2
我可以使用 XSLT 1 或 2
Regards,
问候,
回答by Dimitre Novatchev
I. XSLT 1.0 solution:
一、XSLT 1.0解决方案:
Here is a solution using Muenchian grouping:
这是使用 Muenchian 分组的解决方案:
<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:
请注意:
Muenchian groupingis the most efficient known general grouping method for XSLT 1.0.
Pure "push" styleused.
Muenchian 分组是已知的最有效的 XSLT 1.0 通用分组方法。
使用纯“推”式。
II. XSLT 2.0 solution:
二、XSLT 2.0 解决方案:
<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 文档时,这两种解决方案:
<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>
回答by hielsnoppe
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/ ITEMIDwas spelled consistently all upper-case or camel-case.
如果ItemID/ 的ITEMID拼写始终都是大写或驼峰式,则表达式可以简化。

