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(_at_)CraneSoftwrights(_dot_)com
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