I have an xml document from that I have to remove duplicate <itemGrp>
based on
<rateclass>
value.
If there are multiple <itemGrp>
with the same <rateclass>
exclude all except 1 <itemGrp>
Including xml and xslt, The results can be seen at http://www.freeformatter.com/xsl-transformer.html
by pasting the xml and xslt
XSLT:
<xsl:stylesheet version="2.0"
xmlns:a="http://xml.amadeus.com/FQDRES_12_1_1A"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:vbs="urn:schemas-sqlxml-org:vbs">
<!-- Main Template -->
<xsl:template match="/Responses">
<xsl:element name="Fares">
<xsl:for-each select="./RequestResponse/Fare_DisplayFaresForCityPairReply">
<xsl:for-each select="./a:flightDetails">
<!-- inside each flight details, we want to get all of the item groups-->
<xsl:for-each select="./a:itemGrp">
<!-- if rateclass repeating then skip this record other wise add this record to output file-->
<xsl:element name="Calss">
<xsl:value-of select="./a:fareQualifItem/a:additionalFareDetails/a:rateClass"/>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
XML:
<Responses>
<RequestResponse>
<Fare_DisplayFaresForCityPairReply xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<flightDetails xmlns="http://xml.amadeus.com/FQDRES_12_1_1A">
<itemGrp>
<fareQualifItem>
<additionalFareDetails>
<rateClass>XK2DCA</rateClass>
</additionalFareDetails>
<discountDetails>
<fareQualifier>725</fareQualifier>
</discountDetails>
</fareQualifItem>
</itemGrp>
<itemGrp>
<fareQualifItem>
<additionalFareDetails>
<rateClass>XK2DCAB</rateClass>
</additionalFareDetails>
<discountDetails>
<fareQualifier>725</fareQualifier>
</discountDetails>
</fareQualifItem>
</itemGrp>
<itemGrp>
<fareQualifItem>
<additionalFareDetails>
<rateClass>XK2DCA</rateClass>
</additionalFareDetails>
<discountDetails>
<fareQualifier>725</fareQualifier>
</discountDetails>
</fareQualifItem>
</itemGrp>
</flightDetails>
<flightDetails xmlns="http://xml.amadeus.com/FQDRES_12_1_1A">
<itemGrp>
<fareQualifItem>
<additionalFareDetails>
<rateClass>AAXK2DCA</rateClass>
</additionalFareDetails>
<discountDetails>
<fareQualifier>725</fareQualifier>
</discountDetails>
</fareQualifItem>
</itemGrp>
<itemGrp>
<fareQualifItem>
<additionalFareDetails>
<rateClass>BXK2DCAB</rateClass>
</additionalFareDetails>
<discountDetails>
<fareQualifier>725</fareQualifier>
</discountDetails>
</fareQualifItem>
</itemGrp>
<itemGrp>
<fareQualifItem>
<additionalFareDetails>
<rateClass>AAXK2DCA</rateClass>
</additionalFareDetails>
<discountDetails>
<fareQualifier>725</fareQualifier>
</discountDetails>
</fareQualifItem>
</itemGrp>
</flightDetails>
</Fare_DisplayFaresForCityPairReply>
</RequestResponse>
</Responses>
The response is:
<?xml version="1.0" encoding="UTF-8"?>
<Fares>
<Calss>XK2DCA</Calss>
<Calss>XK2DCAB</Calss>
<Calss>XK2DCA</Calss>
<Calss>AAXK2DCA</Calss>
<Calss>BXK2DCAB</Calss>
<Calss>AAXK2DCA</Calss>
</Fares>
What I want is:
<?xml version="1.0" encoding="UTF-8"?>
<Fares>
<Calss>XK2DCA</Calss>
<Calss>XK2DCAB</Calss>
<Calss>AAXK2DCA</Calss>
<Calss>BXK2DCAB</Calss>
</Fares>
Thanks for the answer Michael. could've been solved:
XSLT 1.0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://xml.amadeus.com/FQDRES_12_1_1A" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:vbs="urn:schemas-sqlxml-org:vbs" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
<!-- Main Template -->
<xsl:key name="rateClass" match="/Responses/RequestResponse/Fare_DisplayFaresForCityPairReply/a:flightDetails/a:itemGrp/a:fareQualifItem/a:additionalFareDetails/a:rateClass/text()" use="." />
<xsl:template match="/Responses">
<xsl:element name="Fares">
<xsl:for-each select="./RequestResponse/Fare_DisplayFaresForCityPairReply">
<xsl:for-each select="./a:flightDetails">
<!-- inside each flight details, we want to get all of the item groups-->
<xsl:for-each select="./a:itemGrp">
<!-- if rateclass repeating then skip this record other wise add this record to output file-->
<xsl:variable name="ItemGroup_Items" select="." />
<!--<xsl:variable name="rateClass_1" select="./a:fareQualifItem/a:additionalFareDetails/a:rateClass"/>
<xsl:if test="vbs:CheckExists($rateClass_1) = 'FALSE'">-->
<xsl:for-each select="./a:fareQualifItem/a:additionalFareDetails/a:rateClass/text()[generate-id()= generate-id(key('rateClass',.)[1])]">
<xsl:element name="Calss">
<xsl:value-of select="." />
</xsl:element>
<xsl:element name="Value_from_itemGrp">
<xsl:value-of select="($ItemGroup_Items/a:fareQualifItem/a:additionalFareDetails/a:rateClass)"/>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>