1

I want to write a XSLT in which I can remove duplicate node while translating. In the below message since the temperature code is same for 1 and 3 node, it is duplicate for me.

The sample Input Message which I am using is

    <document>
    <party>
        <gtin>1000909090</gtin>
        <pos>
            <attrGroupMany name="temperatureInformation">
                <row>
                    <attr name="temperatureCode">STORADE</attr>
                    <attrQual name="maximumTemperature" qual="FAH">80</attrQual>
                    <attrQual name="minimumTemperature" qual="ABC">10</attrQual>
                </row>
                <row>
                    <attr name="temperatureCode">HANDLING</attr>
                    <attrQual name="maximumTemperature" qual="XYZ">20</attrQual>
                    <attrQual name="minimumTemperature" qual="PQR">30</attrQual>
                </row>
                <row>
                    <attr name="temperatureCode">STORADE</attr>
                    <attrQual name="maximumTemperature" qual="FAH">80</attrQual>
                    <attrQual name="minimumTemperature" qual="ABC">10</attrQual>
                </row>
            </attrGroupMany>
        </pos>
    </party>
    </document>

I am using Below XSLT to convert the sample message

    <xsl:stylesheet 
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes"/>


    <xsl:template match="document"> 
        <CatalogItem>
            <RelationshipData>
                <Relationship>
                    <RelationType>temperatureInformation_details</RelationType>  
                    <RelatedItems>      
                        <xsl:for-each select="party/pos/attrGroupMany[@name ='temperatureInformation']/row">                        
                            <RelatedItem>
                                <xsl:attribute name="referenceKey">
                                    <xsl:value-of select="concat('temperatureInformation_details','-',attr[@name='temperatureCode'],'-',attrQual/@name,'-',attrQual/@qual,'-',attrQual    )"/>
                                </xsl:attribute>
                            </RelatedItem>
                        </xsl:for-each>

                    </RelatedItems>
                </Relationship>
            </RelationshipData>
        </CatalogItem>

    </xsl:template> 

    </xsl:stylesheet>

But the current output is incorrect, it is having duplicate value of STORADE

    <?xml version="1.0" encoding="UTF-8"?>
    <CatalogItem>
    <RelationshipData>
      <Relationship>
         <RelationType>temperatureInformation_details</RelationType>
         <RelatedItems>
            <RelatedItem referenceKey="temperatureInformation_details-STORADE-maximumTemperature-FAH-80" />
            <RelatedItem referenceKey="temperatureInformation_details-HANDLING-maximumTemperature-XYZ-20" />
            <RelatedItem referenceKey="temperatureInformation_details-STORADE-maximumTemperature-FAH-80" />
         </RelatedItems>
</Relationship>
    </RelationshipData>
    </CatalogItem>

The correct output should be as below in which duplicate temperate code is removed.

     <?xml version="1.0" encoding="UTF-8"?>
    <CatalogItem>
    <RelationshipData>
      <Relationship>
         <RelationType>temperatureInformation_details</RelationType>
         <RelatedItems>
            <RelatedItem referenceKey="temperatureInformation_details-STORADE-maximumTemperature-FAH-80" />
            <RelatedItem referenceKey="temperatureInformation_details-HANDLING-maximumTemperature-XYZ-20" />

         </RelatedItems>
      </Relationship>
    </RelationshipData>
    </CatalogItem>

Any inputs will be very helpful

1

1 Answer 1

1

Use Muenchian grouping to identify duplicates, a key could be

<xsl:key name="group" match="row" use="concat(attr[@name = 'temperatureCode'], '-', attrQual[@qual = 'FAH'])"/>

then change

                    <xsl:for-each select="party/pos/attrGroupMany[@name ='temperatureInformation']/row">                        

to

                    <xsl:for-each select="party/pos/attrGroupMany[@name ='temperatureInformation']/row[generate-id() = generate-id(key('group', concat(attr[@name = 'temperatureCode'], '-', attrQual[@qual = 'FAH']))[1])]">                        
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.