Monday, 25 December 2017

removing duplicate elements based on a criteria through xslt

This is for removing duplicate elements based on a criteria in a XML document.
E.X:
We have a below XML element structure. We need to Purchase Orders with unique ItemId.

PurchaseOrder:
OrderId       
OrderedQty   
OrderedUOM   
Amount       
Status       
OrderedDate   
Item       
      ItemName       
      ItemDescription   
      ItemId      

Transformation file:
<xsl:template match="/">
    <xsl:variable name="poVar" select="/ns1:PurchaseOrders/ns1:PurchaseOrder"/>
    <ns1:PurchaseOrders>
      <xsl:for-each select="$poVar">
        <xsl:if test="generate-id() = generate-id($poVar[ns1:Item/ns1:ItemId = current()/ns1:Item/ns1:ItemId][1])">
          <ns1:PurchaseOrder>
            <ns1:OrderId>
              <xsl:value-of select="ns1:OrderId"/>
            </ns1:OrderId>
            <ns1:OrderedQty>
              <xsl:value-of select="ns1:OrderedQty"/>
            </ns1:OrderedQty>
            <ns1:OrderedUOM>
              <xsl:value-of select="ns1:OrderedUOM"/>
            </ns1:OrderedUOM>
            <ns1:Amount>
              <xsl:value-of select="ns1:Amount"/>
            </ns1:Amount>
            <ns1:Status>
              <xsl:value-of select="ns1:Status"/>
            </ns1:Status>
            <ns1:OrderedDate>
              <xsl:value-of select="ns1:OrderedDate"/>
            </ns1:OrderedDate>
            <ns1:Item>
              <ns1:ItemName>
                <xsl:value-of select="ns1:Item/ns1:ItemName"/>
              </ns1:ItemName>
              <ns1:ItemDescription>
                <xsl:value-of select="ns1:Item/ns1:ItemDescription"/>
              </ns1:ItemDescription>
              <ns1:ItemId>
                <xsl:value-of select="ns1:Item/ns1:ItemId"/>
              </ns1:ItemId>
            </ns1:Item>
          </ns1:PurchaseOrder>
        </xsl:if>
      </xsl:for-each>
    </ns1:PurchaseOrders>

Please find the complete project here.