rajesh
rajesh

Reputation: 21

XML conversion using XSLT, need to fetch max expirationdate from multiple complex types

I have below node structure and I need to fetch maximum <FTACERTEXPIRATIONDATE> among all <partSupplierFTA> in XSLT. Can somebody please help me on this?

<modelMasterHeader>
   <sender>sender3889</sender>
   <receiver>receiver3890</receiver>
   <messageType>messageType3891</messageType>
   <batchID>97</batchID>
   <modelMaster>
      <ACTION>M</ACTION>
      <PARTNUMBER>PARTNUMBER3893</PARTNUMBER>
      <productCountry>
         <COUNTRYCODE>COUNTRYCODE3894</COUNTRYCODE>
         <COUNTRYGROUP>COUNTRYGROUP3895</COUNTRYGROUP>
         <LOCALPARTDESCRIPTION>LOCALPARTDESCRIPTION3896</LOCALPARTDESCRIPTION>
         <COUNTRYOFORIGIN>COUNTRYOFORIGIN3897</COUNTRYOFORIGIN>
         <HS>-0</HS>
         <HSDESCRIPTION>HSDESCRIPTION3898</HSDESCRIPTION>
         <SOURCESYSTEM>SOURCESYSTEM3899</SOURCESYSTEM>
         <ECCNUM>ECCNUM3900</ECCNUM>
         <USEGENLIC>USEGENLIC3901</USEGENLIC>
         <EXPORTHARMONIZEDTARIFFNUMBER>-0</EXPORTHARMONIZEDTARIFFNUMBER>
         <PARTUNIT>PARTUNIT3902</PARTUNIT>
      </productCountry>
      <Supplier>
         <PARTSUPPCOUNTRYOFORIGIN></PARTSUPPCOUNTRYOFORIGIN>
         <PRIMARYFLAG>Y</PRIMARYFLAG>
         <CTRY_OF_IMPORT>US</CTRY_OF_IMPORT>
         <SEQ_NO>23</SEQ_NO>
         <SupplierFTA>
            <FTASITEID>GLOBAL</FTASITEID>
            <FTASEQNO2>1</FTASEQNO2>
            <FTACERTEXPIRATIONDATE>11/30/2012</FTACERTEXPIRATIONDATE>
            <FTACOUNTRYOFORIGIN>US</FTACOUNTRYOFORIGIN>
            <FTASTATUS>H</FTASTATUS>
            <FTAHTSNUMBER>8414593000</FTAHTSNUMBER>
         </SupplierFTA>
         <SupplierFTA>
            <FTASITEID>GLOBAL</FTASITEID>
            <FTASEQNO2>2</FTASEQNO2>
            <FTACERTEXPIRATIONDATE>12/31/2013</FTACERTEXPIRATIONDATE>
            <FTACOUNTRYOFORIGIN>CN</FTACOUNTRYOFORIGIN>
            <FTASTATUS>V</FTASTATUS>
            <FTAHTSNUMBER>8414593000</FTAHTSNUMBER>
         </SupplierFTA>
         <SupplierFTA>
            <FTASITEID>GLOBAL</FTASITEID>
            <FTASEQNO2>1</FTASEQNO2>
            <FTACERTEXPIRATIONDATE>12/31/2012</FTACERTEXPIRATIONDATE>
            <FTACOUNTRYOFORIGIN>AU</FTACOUNTRYOFORIGIN>
            <FTASTATUS>V</FTASTATUS>
            <FTAHTSNUMBER>8302103000</FTAHTSNUMBER>
         </SupplierFTA>
        </Supplier>
        <Supplier>
         <PARTSUPPCOUNTRYOFORIGIN></PARTSUPPCOUNTRYOFORIGIN>
         <PRIMARYFLAG>Y</PRIMARYFLAG>
         <CTRY_OF_IMPORT>US</CTRY_OF_IMPORT>
         <SEQ_NO>23</SEQ_NO>
         <SupplierFTA>
            <FTASITEID>GLOBAL</FTASITEID>
            <FTASEQNO2>1</FTASEQNO2>
            <FTACERTEXPIRATIONDATE>11/30/2012</FTACERTEXPIRATIONDATE>
            <FTACOUNTRYOFORIGIN>US</FTACOUNTRYOFORIGIN>
            <FTASTATUS>H</FTASTATUS>
            <FTAHTSNUMBER>8414593000</FTAHTSNUMBER>
         </SupplierFTA>
         <SupplierFTA>
            <FTASITEID>GLOBAL</FTASITEID>
            <FTASEQNO2>2</FTASEQNO2>
            <FTACERTEXPIRATIONDATE>12/31/2013</FTACERTEXPIRATIONDATE>
            <FTACOUNTRYOFORIGIN>CN</FTACOUNTRYOFORIGIN>
            <FTASTATUS>V</FTASTATUS>
            <FTAHTSNUMBER>8414593000</FTAHTSNUMBER>
         </SupplierFTA>
         <SupplierFTA>
            <FTASITEID>GLOBAL</FTASITEID>
            <FTASEQNO2>1</FTASEQNO2>
            <FTACERTEXPIRATIONDATE>12/31/2012</FTACERTEXPIRATIONDATE>
            <FTACOUNTRYOFORIGIN>AU</FTACOUNTRYOFORIGIN>
            <FTASTATUS>V</FTASTATUS>
            <FTAHTSNUMBER>8302103000</FTAHTSNUMBER>
         </SupplierFTA>
        </Supplier>
     </ModelMaster>
   </ModelMasterHeader>

Upvotes: 1

Views: 97

Answers (2)

Mads Hansen
Mads Hansen

Reputation: 66781

While it is rather inefficient, you could use an xsl:for-each and sort the values by Year, Month, and Day and select the first item:

<xsl:for-each select="
        /modelMasterHeader/modelMaster/Supplier/SupplierFTA/FTACERTEXPIRATIONDATE
        ">
    <xsl:sort order="descending" data-type="number" 
        select="substring-after(substring-after(., '/'), '/')"/>
    <xsl:sort order="descending" data-type="number" 
        select="substring-before(substring-after(., '/'), '/')"/>
    <xsl:sort order="descending" data-type="number" 
        select="substring-before(.,'/')"/>
    <xsl:if test="position()=1">
        <xsl:value-of select="."/>
    </xsl:if>
</xsl:for-each>

Upvotes: 0

Jim Garrison
Jim Garrison

Reputation: 86774

This will find the latest date, using XSLT2. If you need to find the containing <SupplierFTA> node, this should give you a starting point.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="2.0">
    <xsl:variable name="a" select="//FTACERTEXPIRATIONDATE/text()"/>
    <xsl:template match="root">
        <xsl:value-of select="max(for $x in $a return xs:date(replace($x,'^([0-9]+)/([0-9]+)/([0-9]+)$','$3-$1-$2')))"/>
    </xsl:template>
</xsl:stylesheet>

Upvotes: 1

Related Questions