XSL to select group of rows based on the three XML fields and with these conditions


DevX Home    Today's Headlines   Articles Archive   Tip Bank   Forums   

Results 1 to 2 of 2

Thread: XSL to select group of rows based on the three XML fields and with these conditions

  1. #1
    Join Date
    Oct 2010
    Posts
    2

    XSL to select group of rows based on the three XML fields and with these conditions

    I would like to group based on fields of row element (combination of
    StackNumber,BlockNumber and LocationCode) and select only higher
    BookVersion (BookVersion) based rows in particular group(combination
    of StackNumber,BlockNumber and LocationCode) and also to select the
    rows of DeliveryMode with the value as TRANSIT.

    Here is the input document

    <?xml version="1.0"?>
    <Output>
    <row>
    <StackNumber>19</StackNumber>
    <BlockNumber>61001</BlockNumber>
    <DeliveryMode>TRANSIT</DeliveryMode>
    <LocationCode>MON</LocationCode>
    <BookVersion>03</BookVersion>
    <StoreNumber>1010</StoreNumber>

    </row>
    <row>
    <StackNumber>20</StackNumber>
    <BlockNumber>61001</BlockNumber>
    <DeliveryMode>TRANSIT</DeliveryMode>
    <LocationCode>MON</LocationCode>
    <BookVersion>01</BookVersion>
    <StoreNumber>1011</StoreNumber>
    </row>
    <row>
    <StackNumber>20</StackNumber>
    <BlockNumber>61001</BlockNumber>
    <DeliveryMode>TRANSIT</DeliveryMode>
    <LocationCode>MON</LocationCode>
    <BookVersion>02</BookVersion>
    <StoreNumber>1013</StoreNumber>
    </row>
    <row>
    <StackNumber>21</StackNumber>
    <BlockNumber>61001</BlockNumber>
    <DeliveryMode>RECVD</DeliveryMode>
    <LocationCode>MON</LocationCode>
    <BookVersion>03</BookVersion>
    <StoreNumber>1022</StoreNumber>
    </row>
    <row>
    <StackNumber>21</StackNumber>
    <BlockNumber>61001</BlockNumber>
    <DeliveryMode>TRANSIT</DeliveryMode>
    <LocationCode>MON</LocationCode>
    <BookVersion>03</BookVersion>
    <StoreNumber>1022</StoreNumber>
    </row>
    <row>
    <StackNumber>22</StackNumber>
    <BlockNumber>15098</BlockNumber>
    <DeliveryMode>TRANSIT</DeliveryMode>
    <LocationCode>MON</LocationCode>
    <BookVersion>01</BookVersion>
    <StoreNumber>1010</StoreNumber>
    </row>
    <row>
    <StackNumber>22</StackNumber>
    <BlockNumber>22456</BlockNumber>
    <DeliveryMode>TRANSIT</DeliveryMode>
    <LocationCode>MON</LocationCode>
    <BookVersion>02</BookVersion>
    <StoreNumber>1011</StoreNumber>
    </row>
    <row>
    <StackNumber>22</StackNumber>
    <BlockNumber>22456</BlockNumber>
    <DeliveryMode>TRANSIT</DeliveryMode>
    <LocationCode>MON</LocationCode>
    <BookVersion>03</BookVersion>
    <StoreNumber>1012</StoreNumber>
    </row>
    <row>
    <StackNumber>22</StackNumber>
    <BlockNumber>22456</BlockNumber>
    <DeliveryMode>RECVD</DeliveryMode>
    <LocationCode>MON</LocationCode>
    <BookVersion>02</BookVersion>
    <StoreNumber>1021</StoreNumber>
    </row>
    </Output>
    XSL (using saxon 9 parser) that I wrote:

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

    <xslutput method="xml" indent="yes"/>

    <xsl:key name="transitGroup" match="row"
    use="concat(StackNumber,BlockNumber,LocationCode)"/>

    <xsl:template match="/">
    <Output>
    <xsl:for-each select="//row[generate-id(.) =
    generate-id(key('transitGroup',concat(StackNumber,BlockNumber,LocationCode))[1])]">
    <xsl:variable name="BookVersion"
    select="key('transitGroup',concat(StackNumber,BlockNumber,LocationCode))/BookVersion"/>
    <xsl:if test="DeliveryMode = 'TRANSIT'">
    <row>
    <StackNumber>
    <xsl:value-of select="StackNumber"/>
    </StackNumber>
    <BlockNumber>
    <xsl:value-of select="BlockNumber"/>
    </BlockNumber>
    <LocationCode>
    <xsl:value-of select="LocationCode"/>
    </LocationCode>
    <StoreNumber>
    <xsl:value-of select="StoreNumber"/>
    </StoreNumber>

    <xsl:for-each select="$BookVersion">

    <xsl:sort select="." data-type="number"
    order="descending"/>

    <xsl:if test="position()=1">

    <BookVersion>
    <xsl:value-of select="."/>
    </BookVersion>
    </xsl:if>
    </xsl:for-each>
    </row>
    </xsl:if>
    </xsl:for-each>
    </Output>
    </xsl:template>
    </xsl:stylesheet>


    I wrote this above one but can't figure out to select correct store
    number based on greater value based element 'BookVersion' in each
    group.

    example group must be printed like this .

    <row>
    <StackNumber>20</StackNumber>
    <BlockNumber>61001</BlockNumber>
    <LocationCode>MON</LocationCode>
    <StoreNumber>1013</StoreNumber>
    <BookVersion>02</BookVersion>
    </row>

    I'm getting wrong store number here for a particular selected group.
    I'm struck to proceed further here, I will appreciate if some body can
    lead me the way to write correct it in this XSL.

  2. #2
    Join Date
    Oct 2010
    Posts
    2

    Solutions

    Version 2.0 Based solution:

    <?xml version="1.0" encoding="US-ASCII"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xsd"
    version="2.0">

    <xslutput indent="yes"/>

    <xsl:template match="/">
    <Output>
    <xsl:for-each-group select="*/row[DeliveryMode='TRANSIT']"
    group-by="concat(StackNumber,'&#xd;',
    BlockNumber,'&#xd;',LocationCode)">
    <xsl:for-each select="current-group()
    [xsd:decimal(BookVersion)=
    max(current-group()/BookVersion/xsd:decimal(.))]
    [1]">
    <row>
    <xsl:copy-of select="* except DeliveryMode"/>
    </row>
    </xsl:for-each>
    </xsl:for-each-group>
    </Output>
    </xsl:template>

    </xsl:stylesheet>

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center
 
 
FAQ
Latest Articles
Java
.NET
XML
Database
Enterprise
Questions? Contact us.
C++
Web Development
Wireless
Latest Tips
Open Source


   Development Centers

   -- Android Development Center
   -- Cloud Development Project Center
   -- HTML5 Development Center
   -- Windows Mobile Development Center