help on XSL sorting

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • chandkur
    New Member
    • Mar 2008
    • 4

    help on XSL sorting

    Please help me on this ... i have just started working with XSL, and i need to complete this by weekend.

    Here is the input :
    [code=xml]
    <ussco:ItemPric ing>
    <ussco:ItemList >
    <ussco:ListStar tDate>01/01/2007</ussco:ListStart Date>
    <ussco:ListEndD ate>12/31/2010</ussco:ListEndDa te>
    <ussco:ListAmou nt currencyID="USD ">13.79</ussco:ListAmoun t>
    <ussco:ListUnit Code>KT</ussco:ListUnitC ode>
    </ussco:ItemList>
    <ussco:ItemList >
    <ussco:ListStar tDate>10/08/2004</ussco:ListStart Date>
    <ussco:ListEndD ate>12/31/2006</ussco:ListEndDa te>
    <ussco:ListAmou nt currencyID="USD ">8.95</ussco:ListAmoun t>
    <ussco:ListUnit Code>KT</ussco:ListUnitC ode>
    </ussco:ItemList>
    <ussco:ItemCost >
    <ussco:CostType >FC</ussco:CostType>
    <ussco:CostStar tDate>01/01/2007</ussco:CostStart Date>
    <ussco:CostEndD ate>12/31/2010</ussco:CostEndDa te>
    <oagis:CostAmou nt currencyID="USD ">5.170</oagis:CostAmoun t>
    <ussco:CostUnit Code>KT</ussco:CostUnitC ode>
    </ussco:ItemCost>
    <ussco:ItemCost >
    <ussco:CostType >FC</ussco:CostType>
    <ussco:CostStar tDate>10/08/2004</ussco:CostStart Date>
    <ussco:CostEndD ate>12/31/2006</ussco:CostEndDa te>
    <oagis:CostAmou nt currencyID="USD ">4.470</oagis:CostAmoun t>
    <ussco:CostUnit Code/>
    </ussco:ItemCost>
    <ussco:ItemCost >
    <ussco:CostType >PR</ussco:CostType>
    <ussco:CostStar tDate>12/10/2007</ussco:CostStart Date>
    <ussco:CostEndD ate>06/30/2008</ussco:CostEndDa te>
    <oagis:CostAmou nt currencyID="USD ">3.860</oagis:CostAmoun t>
    <ussco:CostUnit Code>KT</ussco:CostUnitC ode>
    </ussco:ItemCost>
    <ussco:ItemCost >
    <ussco:CostType >PR</ussco:CostType>
    <ussco:CostStar tDate>11/01/2007</ussco:CostStart Date>
    <ussco:CostEndD ate>06/30/2008</ussco:CostEndDa te>
    <oagis:CostAmou nt currencyID="USD ">4.653</oagis:CostAmoun t>
    <ussco:CostUnit Code/>
    </ussco:ItemCost>
    [/code]
    This is the output expected :
    [code=xml]
    <ItemMaster xmlns:us="http://www.ussco.com/oagis/0">
    <CostLineInq>
    <ShortName>AMER AC</ShortName>
    <ListStartDate> 01/01/2007</ListStartDate>
    <ListEndDate> 12/31/2010</ListEndDate>
    <ListAmount>13. 79</ListAmount>
    <ListUnitCode>K T</ListUnitCode>
    <CostStartDate> 01/01/2007</CostStartDate>
    <CostEndDate> 12/31/2010</CostEndDate>
    <CostAmount>5.1 70</CostAmount>
    <CostUnitCode>F C</CostUnitCode>
    </CostLineInq>
    <CostLineInq>
    <ShortName>AMER AC</ShortName>
    <ListStartDate> 10/08/2004</ListStartDate>
    <ListEndDate> 12/31/2006</ListEndDate>
    <ListAmount>8.9 5</ListAmount>
    <ListUnitCode>K T</ListUnitCode>
    <CostStartDate> 12/10/2007</CostStartDate>
    <CostEndDate> 06/30/2008</CostEndDate>
    <CostAmount>3.8 60</CostAmount>
    <CostUnitCode>P R</CostUnitCode>
    </CostLineInq>
    <CostLineInq>
    <ShortName>AMER AC</ShortName>
    <ListStartDate> </ListStartDate>
    <ListEndDate> </ListEndDate>
    <ListAmount></ListAmount>
    <ListUnitCode ></ListUnitCode>
    <CostStartDate> 11/01/2007</CostStartDate>
    <CostEndDate> 06/30/2008</CostEndDate>
    <CostAmount>4.6 53</CostAmount>
    <CostUnitCode>P R</CostUnitCode>
    </CostLineInq>
    <CostLineInq>
    <ShortName>AMER AC</ShortName>
    <ListStartDate> </ListStartDate>
    <ListEndDate> </ListEndDate>
    <ListAmount></ListAmount>
    <ListUnitCode ></ListUnitCode>
    <CostStartDate> 10/08/2004</CostStartDate>
    <CostEndDate> 12/31/2006</CostEndDate>
    <CostAmount>4.4 70</CostAmount>
    <CostUnitCode>F C</CostUnitCode>
    </CostLineInq>
    </ItemMaster>
    [/code]

    and here is the XSL i am struggling with to get the above output :
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:oa="http://www.openapplications.org/oagis/9" xmlns:us="http://www.ussco.com/oagis/0">
    	<xsl:output method="xml" version="1.0" encoding="UTF-16" indent="yes"/>
    	<xsl:namespace-alias stylesheet-prefix="oa" result-prefix="oa"/>
    	<xsl:template match="/">
    		<ItemMaster>
    			<xsl:variable name="ShortName" select="//us:ItemMaster/us:ItemMasterHeader/oa:ManufacturerItemID/oa:ID/@schemeAgencyName"/>
    			<xsl:for-each select="//us:ItemPricing">
    				
    				<xsl:variable name="currentPricingNode" select="."/>
    				<xsl:for-each select="us:ItemCost">
    				
    				<xsl:sort select="substring(us:CostEndDate,7,4)" order="descending"/> <!-- year  -->
    
    
    					<xsl:variable name="costIndex" select="position()"/>
    					<CostLineInq>
    						<ShortName>
    							<xsl:value-of select="$ShortName"/>
    						</ShortName>
    						<ListStartDate>
    
    							<xsl:value-of select="$currentPricingNode/us:ItemList[$costIndex]/us:ListStartDate"/>
    						</ListStartDate>
    						<ListEndDate>
    							<xsl:value-of select="$currentPricingNode/us:ItemList[$costIndex]/us:ListEndDate"/>
    						</ListEndDate>
    						<ListAmount>
    							<xsl:value-of select="$currentPricingNode/us:ItemList[$costIndex]/us:ListAmount"/>
    						</ListAmount>
    						<ListUnitCode>
    							<xsl:value-of select="$currentPricingNode/us:ItemList[$costIndex]/us:ListUnitCode"/>
    						</ListUnitCode>
    						<CostStartDate>
    
    							<xsl:value-of select="us:CostStartDate"/>
    						</CostStartDate>
    						<CostEndDate>
    							<xsl:value-of select="us:CostEndDate"/>
    						</CostEndDate>
    						<CostAmount>
    							<xsl:value-of select="$currentPricingNode/us:ItemCost[$costIndex]/oa:CostAmount"/>
    						</CostAmount>
    						<CostUnitCode>
    							<xsl:value-of select="$currentPricingNode/us:ItemCost[$costIndex]/us:CostType"/>
    						</CostUnitCode>
    					</CostLineInq>
    				</xsl:for-each>
    			</xsl:for-each>
    		</ItemMaster>
    	</xsl:template>
    </xsl:stylesheet>
    Thanks in advance for the help...
    Last edited by jkmyoung; Mar 7 '08, 06:19 PM. Reason: code tags
  • MarkoKlacar
    Recognized Expert Contributor
    • Aug 2007
    • 296

    #2
    Hi,

    Could you re-post using code tags?
    Thanks

    Comment

    • chandkur
      New Member
      • Mar 2008
      • 4

      #3
      input XML :
      [code=xml]
      <?xml version="1.0" encoding="UTF-8"?>
      <ussco:ShowItem Master xmlns:oagis="ht tp://www.openapplica tions.org/oagis/9" xmlns:ussco="ht tp://www.ussco.com/oagis/0" xmlns:hats="htt p://webserviceclass es" xmlns:wsg="http ://www.ussco.com/webservicegatew ay" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http ://www.w3.org/2001/XMLSchema-instance" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:coe="http ://www.CSCOE070O.c om/schemas/CSCOE070OInterf ace" xmlns:proc="htt p://webservicegatew ay.ussco.com/Implementation/ProcessingData" xmlns:soapenv=" http://schemas.xmlsoap .org/soap/envelope/">
      <oagis:Applicat ionArea>
      <oagis:Creation DateTime>2008-03-05T10:05:03.644-06:00</oagis:CreationD ateTime>
      </oagis:Applicati onArea>
      <ussco:DataArea >
      <oagis:Show/>
      <ussco:ItemMast er>
      <ussco:ItemMast erHeader>
      <oagis:ItemID agencyRole="Pre fix_Number">
      <oagis:ID>AAC </oagis:ID>
      </oagis:ItemID>
      <oagis:ItemID agencyRole="Sto ck_Number_Butte d">
      <oagis:ID>11035 M</oagis:ID>
      </oagis:ItemID>
      <oagis:Manufact urerItemID>
      <oagis:ID schemeAgencyNam e="AMERAC" schemeAgencyID= "0322"/>
      </oagis:Manufactu rerItemID>
      <oagis:Specific ation>
      <oagis:Property >
      <oagis:Descript ion type="Product_D escription">TOO L,POTTERY KIT,8/KT,WN</oagis:Descripti on>
      </oagis:Property>
      </oagis:Specifica tion>
      <oagis:Hazardou sMaterial>
      <oagis:ID>N</oagis:ID>
      </oagis:Hazardous Material>
      <ussco:FreightC lassification>
      <oagis:Codes>
      <oagis:Code name="UPSAble_I ndicator" sequence="1">Y</oagis:Code>
      <oagis:Code name="Oversized _Indicator" sequence="1"/>
      </oagis:Codes>
      </ussco:FreightCl assification>
      <oagis:BuyerPar ty>
      <oagis:Contac t>
      <oagis:ID>786 </oagis:ID>
      </oagis:Contact>
      </oagis:BuyerPart y>
      <ussco:GLCatalo gPageNumber>799 7</ussco:GLCatalog PageNumber>
      </ussco:ItemMaste rHeader>
      <ussco:ItemLoca tion>
      <ussco:Classifi cation type="Ship_Clas s_Code">
      <ussco:Codes>
      <oagis:Code sequence="1"/>
      </ussco:Codes>
      </ussco:Classific ation>
      <ussco:Classifi cation type="Item_Clas s_Code">
      <ussco:Codes>
      <oagis:Code sequence="1">00 </oagis:Code>
      </ussco:Codes>
      </ussco:Classific ation>
      <ussco:Classifi cation type="Recycle_I ndicator">
      <ussco:Codes>
      <oagis:Code sequence="1">N</oagis:Code>
      </ussco:Codes>
      </ussco:Classific ation>
      <ussco:Classifi cation type="Air_Ship_ Indicator">
      <ussco:Codes>
      <oagis:Code sequence="1">Y</oagis:Code>
      </ussco:Codes>
      </ussco:Classific ation>
      <ussco:Classifi cation type="Non_Retur nable_Indicator ">
      <ussco:Codes>
      <oagis:Code sequence="1"/>
      </ussco:Codes>
      </ussco:Classific ation>
      <ussco:Classifi cation type="Stock_Sta tus_Code">
      <ussco:Codes>
      <oagis:Code sequence="1">24 </oagis:Code>
      </ussco:Codes>
      </ussco:Classific ation>
      <ussco:Packagin g>
      <oagis:ID>Carto n</oagis:ID>
      <ussco:Dimensio ns>
      <oagis:WidthMea sure unitCode="IN">5 .500</oagis:WidthMeas ure>
      <oagis:LengthMe asure unitCode="IN">9 .750</oagis:LengthMea sure>
      <oagis:HeightMe asure unitCode="IN">1 2.750</oagis:HeightMea sure>
      <ussco:Weight unitCode="LB">4 .000</ussco:Weight>
      </ussco:Dimension s>
      <oagis:PerPacka geQuantity unitCode="KT">1 2</oagis:PerPackag eQuantity>
      </ussco:Packaging >
      <ussco:UnitPack aging>
      <oagis:ID>Box </oagis:ID>
      <oagis:PerPacka geQuantity unitCode="KT">1 </oagis:PerPackag eQuantity>
      </ussco:UnitPacka ging>
      <ussco:PalletCa pacityQuantity> 0</ussco:PalletCap acityQuantity>
      </ussco:ItemLocat ion>
      <ussco:GlobalIt em>
      <ussco:Inventor yUnitCode>KT</ussco:Inventory UnitCode>
      <ussco:ItemWidt h unitCode="IN">1 1.400</ussco:ItemWidth >
      <ussco:ItemLeng th unitCode="IN">1 1.500</ussco:ItemLengt h>
      <ussco:ItemHeig ht unitCode="IN">1 .200</ussco:ItemHeigh t>
      <ussco:ItemWeig ht unitCode="LB">0 .263</ussco:ItemWeigh t>
      <ussco:UPCCarto n>00 0 39672 11035 9</ussco:UPCCarton >
      <ussco:CountryO riginCode>US</ussco:CountryOr iginCode>
      </ussco:GlobalIte m>
      <ussco:ItemPric ing>
      <ussco:ItemList >
      <ussco:ListStar tDate>01/01/2007</ussco:ListStart Date>
      <ussco:ListEndD ate>12/31/2010</ussco:ListEndDa te>
      <ussco:ListAmou nt currencyID="USD ">13.79</ussco:ListAmoun t>
      <ussco:ListUnit Code>KT</ussco:ListUnitC ode>
      </ussco:ItemList>
      <ussco:ItemList >
      <ussco:ListStar tDate>10/08/2004</ussco:ListStart Date>
      <ussco:ListEndD ate>12/31/2006</ussco:ListEndDa te>
      <ussco:ListAmou nt currencyID="USD ">8.95</ussco:ListAmoun t>
      <ussco:ListUnit Code>KT</ussco:ListUnitC ode>
      </ussco:ItemList>
      <ussco:ItemList >
      <ussco:ListStar tDate>10/08/2004</ussco:ListStart Date>
      <ussco:ListEndD ate>06/23/2008</ussco:ListEndDa te>
      <ussco:ListAmou nt currencyID="USD ">18.95</ussco:ListAmoun t>
      <ussco:ListUnit Code>KT</ussco:ListUnitC ode>
      </ussco:ItemList>
      <ussco:ItemCost >
      <ussco:CostType >FC</ussco:CostType>
      <ussco:CostStar tDate>01/01/2007</ussco:CostStart Date>
      <ussco:CostEndD ate>12/31/2010</ussco:CostEndDa te>
      <oagis:CostAmou nt currencyID="USD ">5.170</oagis:CostAmoun t>
      <ussco:CostUnit Code>KT</ussco:CostUnitC ode>
      </ussco:ItemCost>
      <ussco:ItemCost >
      <ussco:CostType >FC</ussco:CostType>
      <ussco:CostStar tDate>10/08/2004</ussco:CostStart Date>
      <ussco:CostEndD ate>12/31/2006</ussco:CostEndDa te>
      <oagis:CostAmou nt currencyID="USD ">4.470</oagis:CostAmoun t>
      <ussco:CostUnit Code/>
      </ussco:ItemCost>

      </ussco:ItemPrici ng>
      <ussco:ItemList >
      <ussco:ListAmou nt currencyID="USD ">13.79</ussco:ListAmoun t>
      </ussco:ItemList>
      </ussco:ItemMaste r>
      </ussco:DataArea>
      </ussco:ShowItemM aster>
      [/code]
      Expected output XML after merging the ItemList and ItemCost nodes should be as follows :
      [code=xml]
      <?xml version="1.0" encoding="UTF-16"?>
      <ItemMaster xmlns:us="http://www.ussco.com/oagis/0">
      <CostLineInq>
      <ShortName>AMER AC</ShortName>
      <ListStartDate> 01/01/2007</ListStartDate>
      <ListEndDate> 12/31/2010</ListEndDate>
      <ListAmount>13. 79</ListAmount>
      <ListUnitCode>K T</ListUnitCode>
      <CostStartDate> 01/01/2007</CostStartDate>
      <CostEndDate> 12/31/2010</CostEndDate>
      <CostAmount>5.1 70</CostAmount>
      <CostUnitCode>F C</CostUnitCode>
      </CostLineInq>
      <CostLineInq>
      <ShortName>AMER AC</ShortName>
      <ListStartDate> 10/08/2004</ListStartDate>
      <ListEndDate> 06/23/2008</ListEndDate>
      <ListAmount>18. 95</ListAmount>
      <ListUnitCode>K T</ListUnitCode>
      <CostStartDate> 10/08/2004</CostStartDate>
      <CostEndDate> 12/31/2006</CostEndDate>
      <CostAmount>4.4 70</CostAmount>
      <CostUnitCode>F C</CostUnitCode>
      </CostLineInq>
      <CostLineInq>
      <ShortName>AMER AC</ShortName>
      <ListStartDate> 10/08/2004</ListStartDate>
      <ListEndDate> 12/31/2006</ListEndDate>
      <ListAmount>8.9 5</ListAmount>
      <ListUnitCode>K T</ListUnitCode>
      <CostStartDate> </CostStartDate>
      <CostEndDate> </CostEndDate>
      <CostAmount></CostAmount>
      <CostUnitCode ></CostUnitCode>
      </CostLineInq>
      </ItemMaster>
      [/code]
      This is the XSL that i have been working with :
      [code=xml]
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:styleshe et version="2.0" xmlns:xsl="http ://www.w3.org/1999/XSL/Transform" xmlns:oa="http://www.openapplica tions.org/oagis/9" xmlns:us="http://www.ussco.com/oagis/0">
      <xsl:output method="xml" version="1.0" encoding="UTF-16" indent="yes"/>
      <xsl:namespac e-alias stylesheet-prefix="oa" result-prefix="oa"/>
      <xsl:template match="/">
      <ItemMaster>
      <xsl:variable name="ShortName " select="//us:ItemMaster/us:ItemMasterHe ader/oa:Manufacturer ItemID/oa:ID/@schemeAgencyNa me"/>
      <xsl:for-each select="//us:ItemPricing" >
      <xsl:variable name="lists" as="node()*">
      <xsl:perform-sort select="us:Item List">
      <xsl:sort select="concat( substring(us:Li stEndDate,7,4), substring(us:Li stEndDate,4,2), substring(us:Li stEndDate,1,2)) " data-type="number" order="descendi ng"/>
      </xsl:perform-sort>
      </xsl:variable>
      <xsl:variable name="costs" as="node()*">
      <xsl:perform-sort select="us:Item Cost">
      <xsl:sort select="concat( substring(us:Co stEndDate,7,4), substring(us:Co stEndDate,4,2), substring(us:Co stEndDate,1,2)) " data-type="number" order="descendi ng"/>
      </xsl:perform-sort>
      </xsl:variable>
      <xsl:for-each select="$costs" >
      <xsl:variable name="location" select="positio n()" />
      <CostLineInq>
      <ShortName>
      <xsl:value-of select="$ShortN ame"/>
      </ShortName>
      <ListStartDat e>
      <xsl:value-of select="$lists[$location]/us:ListStartDat e"/>
      </ListStartDate>
      <ListEndDate>
      <xsl:value-of select="$lists[$location]/us:ListEndDate"/>
      </ListEndDate>
      <ListAmount>
      <xsl:value-of select="$lists[$location]/us:ListAmount"/>
      </ListAmount>
      <ListUnitCode >
      <xsl:value-of select="$lists[$location]/us:ListUnitCode "/>
      </ListUnitCode>
      <CostStartDat e>
      <xsl:value-of select="us:Cost StartDate"/>
      </CostStartDate>
      <CostEndDate>
      <xsl:value-of select="us:Cost EndDate"/>
      </CostEndDate>
      <CostAmount>
      <xsl:value-of select="oa:Cost Amount"/>
      </CostAmount>
      <CostUnitCode >
      <xsl:value-of select="us:Cost Type"/>
      </CostUnitCode>
      </CostLineInq>
      </xsl:for-each>
      </xsl:for-each>
      </ItemMaster>
      </xsl:template>
      </xsl:stylesheet>
      [/code]
      Last edited by jkmyoung; Mar 7 '08, 07:46 PM. Reason: code tags

      Comment

      • jkmyoung
        Recognized Expert Top Contributor
        • Mar 2006
        • 2057

        #4
        [$costIndex] will return true always since the variable always exists.
        You want [position() = $costIndex]

        [code=xml]
        <xsl:for-each select="$curren tPricingNode/us:ItemList[position() = $costIndex]">
        <ListStartDat e>
        <xsl:value-of select="us:List StartDate"/>
        </ListStartDate>
        <ListEndDate>
        <xsl:value-of select="us:List EndDate"/>
        </ListEndDate>
        <ListAmount>
        <xsl:value-of select="us:List Amount"/>
        </ListAmount>
        <ListUnitCode >
        <xsl:value-of select="us:List UnitCode"/>
        </ListUnitCode>
        </xsl:for-each>
        [/code]

        Comment

        • chandkur
          New Member
          • Mar 2008
          • 4

          #5
          Thank you for responding to my question, but i already found a way to get over this problem.
          Last edited by jkmyoung; Mar 17 '08, 09:36 PM. Reason: Remove quote

          Comment

          Working...