2016-07-22 12 views
0

Wir erhalten doppelte Tags in dieser XML-Eingabe. Wir wollten diese Duplizierung mithilfe der XSLT2.0-Vorlagenanweisung entfernen.XSLT: So entfernen Sie doppelte Tags in XML

XML-Input-:

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

Wir haben versucht folgende XSLT darauf:

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

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

Dieses Element innerhalb XML dupliziert.

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

Jede Hilfe darauf wäre sehr geschätzt!

Antwort

2

Wenn alles, was Sie beseitigen wollen, ist die exakte Duplikate von CommentLine Elemente dann

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

wenn ich Vorlage angewendet. Es entfernt das Duplikat. aber das Extra leeres Tag bleibt bestehen. – NEO

+0

Ausgabe wird wie folgt http://paste.ofcode.org/HwPtCf7sJepei8rdHBtARF – NEO

+0

Und was ist falsch mit dieser Ausgabe? Es scheint so zu sein, was Sie als die erwartete Ausgabe beschreiben, es sei denn, ich verpasse etwas. –