0

I have a tricky requirement in XSLT

Input XML is below

<Orders>
    <Order>
        <OrderNumber>100</OrderNumber>
        <Date>116256</Date>
    </Order>
    <Order>
        <OrderNumber>101</OrderNumber>
        <Date>116257</Date>
    </Order>
    <Order>
        <OrderNumber>102</OrderNumber>
        <Date>116286</Date>
    </Order>
    <Order>
        <OrderNumber>102</OrderNumber>
        <Date>116276</Date>
    </Order>    
</Orders>

My requirement is to check for same ordernumber, if they are same then take the date which is higher, in my case its in julian format, so I have to just take the one which is higher number.

The output XML should look as below.

<Orders>
    <Order>
        <OrderNumber>100</OrderNumber>
        <Date>116256</Date>
    </Order>
    <Order>
        <OrderNumber>101</OrderNumber>
        <Date>116257</Date>
    </Order>
    <Order>
        <OrderNumber>102</OrderNumber>
        <Date>116286</Date>
    </Order>
    <Order>
        <OrderNumber>102</OrderNumber>
        <Date>116286</Date>
    </Order>    
</Orders>

Thanks Yatan

Yatan
  • 89
  • 5
  • Your output seems to be identical to the input. Judging by your description, this is a *grouping* question. Do a search - it's probably the most often asked XSLT question here. Note that answers are different for XSLT 1.0 or 2.0. – michael.hor257k Oct 18 '16 at 14:18
  • HI Michael, In the output XML the last 2 orders are with same order number, so the date column has changed to the higher date – Yatan Oct 18 '16 at 14:39
  • I see. Does your processor support XSLT 2.0? – michael.hor257k Oct 18 '16 at 14:41
  • yes Michael......................... – Yatan Oct 18 '16 at 14:53

1 Answers1

0

Here's one way you could look at it:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="order-by-number" match="Order" use="OrderNumber" />

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

<xsl:template match="Date">
    <xsl:copy>
        <xsl:value-of select="max(key('order-by-number', ../OrderNumber)/Date)"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
michael.hor257k
  • 113,275
  • 6
  • 33
  • 51