[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: How to sort a nodeset returned by key()?

Subject: Re: How to sort a nodeset returned by key()?
From: "Olivier Mengué" <olivier.mengue@xxxxxxxxx>
Date: Tue, 8 Apr 2008 23:47:33 +0200
Re:  How to sort a nodeset returned by key()?
It looks like XML tags in my posts have been filtered by hotmail, so
I'm reposting.

2008/4/5, Dolmen ! <dolmen@xxxxxxxxxxx>:
>
>  Hi,
>
>  Short:
>  How can i sort a nodeset returned by key(), store it in a variable,
>  and still be able to compare its nodes with  nodes of the original
>  document ?
>
>  Long:
>
>  This is a transformation of my data set to an HTML table using rowspans.
>  I'm sorting my data, then I'm using a Muenchian grouping to group rows.
>
>  My problem is that the order of my sorted node set is not the same as
>  the order of the nodeset returned by key(). I have not found how to
>  reliably distinguish the first node of the group to output the
>  grouping cells in the right place.
>
>  I'm using xsltproc (from libxslt)
>
>  Here is an example using Steve Muench's data from
>  http://www.dpawson.co.uk/xsl/sect2/N7450.html#d11343e31
>
>  If I remove this sort, the XHTML, is clean, but the table is not sorted.
>

<demo>
  <salesman id="0001" name="Rick Peterson">
    <account id="act001" region="Midwest">Johnosn's Laundry</account>
    <account id="act002" region="Canada">Franks's Laundry</account>
    <account id="act003" region="Alaska">Mary's Laundry</account>
    <account id="act004" region="New Jersey">Bill's Laundry</account>
    <account id="act005" region="Midwest">Hammond's Laundry</account>
  </salesman>
  <salesman id="0003" name="Ty Coon">
    <account id="act006" region="Canada">Franks's Diner</account>
    <account id="act007" region="Midwest">Johnosn's Diner</account>
    <account id="act008" region="Canada">Hammond's Diner</account>
    <account id="act009" region="Alaska">Mary's Diner</account>
    <account id="act010" region="Alaska">Bill's Diner</account>
  </salesman>
</demo>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="UTF-8"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
omit-xml-declaration="yes" />
  <xsl:strip-space elements="*"/>

  <!--
  The output is completely broken as the result of key() is not in
  the same order as the for-each node set.
  -->



  <xsl:key name="accounts-by-region" match="/demo/salesman/account"
use="@region"/>

  <xsl:template match="/demo">
    <html>
    <head><title>Accounts ordered by region</title></head>
      <body>
        <table border="1" valign="top">
          <tr><th>Region</th><th>Account</th></tr>
          <xsl:for-each select="salesman/account">
              <xsl:sort select="@region"/>
              <xsl:sort select="."/>
              <xsl:variable name="brand-model" select="concat(brand, '
', model)"/>
              <tr>
                 <xsl:if test="count(. | key('accounts-by-region',
@region)[1]) = 1">
                   <td><xsl:attribute name="rowspan"><xsl:value-of
select="count(key('accounts-by-region',
@region))"/></xsl:attribute><xsl:value-of select="@region"/></td>
                 </xsl:if>
                 <td><xsl:value-of select="."/></td>
              </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>


Olivier Mengui.
http://o.mengue.free.fr/

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.