Re: [xsl] Sorting problem

Subject: Re: [xsl] Sorting problem
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Wed, 03 Sep 2003 15:46:04 -0400
At 2003-09-03 14:54 -0400, Cox, Todd (NIH/NCI) wrote:
I am trying to do a sort based on a parameter which I can do ok with the
following sort statement:

<xsl:sort select="server_name[$sort='server_name'] |
                            nds_name[$sort='nds_name'] |
                            short_name[$sort='short_name'] |
                            total_space[$sort='total_space']"
order="{$order}" data-type="{$dtype}"/>

The above code sorts fine but I have one other sorting criteria.

As you already show, put each sort criterion in a separate <xsl:sort/>. But remember that when XSLT finds equal members of the first sort key, it looks to find a second (separately specified) sort key, and so on until it runs out of keys ... then the sort order is in document order. So, you can play on an expression that produces a fixed value for every member, and the result of the sort will be in document order.


<xsl:sort select="format-number((number(used_space) div number(total_space))
* 100,'0')" order="{$order}" data-type="number"/>

If you are using format-number to round to two decimals, you could just use a pattern of "0.00" because the processor will round to the digits of significance that you specify.


but when I put it in with the following I get an error.

<xsl:sort select="server_name[$sort='server_name'] |
                  nds_name[$sort='nds_name'] |
                  short_name[$sort='short_name'] |
                  total_space[$sort='total_space'] |
                  format-number((number(used_space) div number(total_space))
*100,'0')[$sort='percent']"
order="{$order}" data-type="{$dtype}"/>

Right ... because you can only use a predicate on a node expression, not on a string expression.


If you split it into two sorts you should get what you want, because the first one will evaluate to the empty string for $sort='percent', thus preserving all of the nodes in document order, and the second one will then be used for all the nodes.

  <xsl:sort select="server_name[$sort='server_name'] |
                    nds_name[$sort='nds_name'] |
                    short_name[$sort='short_name'] |
                    total_space[$sort='total_space']"
                    order="{$order}" data-type="{$dtype}">
  <xsl:sort select="format-number((number(used_space) div
                    number(total_space)),'0.00')"
                    order="{$order}" data-type="number"/>

This will have the effect of sorting all of the server_names by the average used space, though, so if you don't want that then use:

  <xsl:sort select="server_name[$sort='server_name'] |
                    nds_name[$sort='nds_name'] |
                    short_name[$sort='short_name'] |
                    total_space[$sort='total_space']"
                    order="{$order}" data-type="{$dtype}">
  <xsl:sort select="format-number((number(used_space div
                    number(total_space[$sort='percent'])),'0.00')"
                    order="{$order}" data-type="number"/>

This will produce the unreported error of NaN for the second sort key for every kind of sort other than 'percent', thus preserving document order.

All I did was place your predicate trick of using the variable reference on the part of the expression that is a node set.

I hope this helps.

..................... Ken

--
Next public European delivery:  3-day XSLT/2-day XSL-FO 2003-09-22
Instructor-led on-site corporate, government & user group training
for XSLT and XSL-FO world-wide:  please contact us for the details

G. Ken Holman                 mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0    +1(613)489-0999 (F:-0995)
ISBN 0-13-065196-6                       Definitive XSLT and XPath
ISBN 0-13-140374-5                               Definitive XSL-FO
ISBN 1-894049-08-X   Practical Transformation Using XSLT and XPath
ISBN 1-894049-11-X               Practical Formatting Using XSL-FO
Member of the XML Guild of Practitioners:     http://XMLGuild.info
Male Breast Cancer Awareness  http://www.CraneSoftwrights.com/s/bc


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list



Current Thread