XSLT:如何删除XML中的重复标签

问题描述:

我们在此输入XML中获取重复标签。我们想要使用XSLT2.0模板指令来消除这种重复。XSLT:如何删除XML中的重复标签

输入XML:

<?xml version="1.0" encoding="UTF-8"?> 
<SalesOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="SDOC.XSD"> 
    <Orders> 
     <OrderHeader> 
     <CustomerPoNumber>AB-54354</CustomerPoNumber> 
     </OrderHeader> 
     <OrderDetails> 
     <CommentLine> 
      <Comment>Ensure saddle is color coded</Comment> 
      <OrderLineID>OR-1810127</OrderLineID> 
     </CommentLine> 
     <CommentLine> 
      <Comment>EDI-001</Comment> 
      <OrderLineID>OR-1810128</OrderLineID> 
     </CommentLine> 
     <StockLine> 
      <CustomerPoLine>9999</CustomerPoLine> 
      <StockCode>ABSH-SMH-12OZ-01</StockCode> 
      <StockDescription>SMH ABS BALANCE SHAMPOO 12OZ</StockDescription> 
      <OrderQty>1.0</OrderQty> 
     </StockLine> 
     <CommentLine> 
      <Comment>This is for test purpose</Comment> 
      <OrderLineID>OR-1810124</OrderLineID> 
     </CommentLine> 
     <CommentLine> 
      <Comment>EDI-SAVE</Comment> 
      <OrderLineID>OR-1810125</OrderLineID> 
     </CommentLine> 
     <CommentLine> 
      <Comment>Ensure saddle is color coded</Comment> 
      <OrderLineID>OR-1810127</OrderLineID> 
     </CommentLine> 
     </OrderDetails> 
    </Orders> 
</SalesOrders> 

我们试图下它XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" encoding="Windows-1252" indent="yes" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy copy-namespaces="no"> 
     <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="StockLine[not(StockCodeDescription) and not (OrderQty) and not(Price)]"> 
     <CommentLine> 
     <Comment> 
      <xsl:value-of select="StockCode" /> 
     </Comment> 
     <xsl:copy-of select="OrderLineID" /> 
     </CommentLine> 
    </xsl:template> 
    <xsl:template match="CommentLine[OrderLineID = preceding-sibling::StockLine/OrderLineID and not(Comment)]" /> 
</xsl:stylesheet> 

预期输出XML:

<?xml version="1.0" encoding="UTF-8"?> 
<SalesOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="SDOC.XSD"> 
    <Orders> 
     <OrderHeader> 
     <CustomerPoNumber>AB-54354</CustomerPoNumber> 
     </OrderHeader> 
     <OrderDetails> 
     <CommentLine> 
      <Comment>Ensure saddle is color coded</Comment> 
      <OrderLineID>OR-1810127</OrderLineID> 
     </CommentLine> 
     <CommentLine> 
      <Comment>EDI-001</Comment> 
      <OrderLineID>OR-1810128</OrderLineID> 
     </CommentLine> 
     <StockLine> 
      <CustomerPoLine>9999</CustomerPoLine> 
      <StockCode>ABSH-SMH-12OZ-01</StockCode> 
      <StockDescription>SMH ABS BALANCE SHAMPOO 12OZ</StockDescription> 
      <OrderQty>1.0</OrderQty> 
     </StockLine> 
     <CommentLine> 
      <Comment>This is for test purpose</Comment> 
      <OrderLineID>OR-1810124</OrderLineID> 
     </CommentLine> 
     <CommentLine> 
      <Comment>EDI-SAVE</Comment> 
      <OrderLineID>OR-1810125</OrderLineID> 
     </CommentLine> 
     </OrderDetails> 
    </Orders> 
</SalesOrders> 

此元素中的XML复制。

<CommentLine> 
      <Comment>Ensure saddle is color coded</Comment> 
      <OrderLineID>OR-1810127</OrderLineID> 
      </CommentLine> 

任何帮助,将不胜感激!

如果你想要消除是CommentLine元素的精确副本,然后使用

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

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

    <xsl:template match="CommentLine[some $sib in preceding-sibling::CommentLine satisfies deep-equal(., $sib)]"/> 
</xsl:stylesheet> 
+0

当我应用的模板。它正在删除重复。但Extra 空标签仍然存在。 – NEO

+0

输出变成像这样http://paste.ofcode.org/HwPtCf7sJepei8rdHBtARF – NEO

+0

这个输出有什么问题?这似乎是你所描述的预期产出,除非我错过了一些东西。 –