This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: sorting & counting
- To: "Igor Semenko" <isemenko at stel dot sebastopol dot ua>
- Subject: Re: sorting & counting
- From: Jeni Tennison <jeni at friday dot u-net dot com>
- Date: Wed, 28 Jun 2000 22:03:54 +0100
- Cc: <xsl-list at mulberrytech dot com>
- Reply-To: xsl-list at mulberrytech dot com
Igor,
>1. sort them by 'priority'
>2. leave, say, only 3 nodes in the result
Here's a solution. First, specify the number of nodes you want in a
parameter, so that you can change it whenever you like:
<xsl:param name="nodes" select="'3'" />
Next, you want to treat the nodes individually despite them being nested
inside each other, and you want to sort them within your output in order of
priority. You can use either xsl:for-each or xsl:apply-templates to select
the nodes within the document, whatever their level (using //node) and
xsl:sort within whichever you use to sort in order of priority. For example:
<xsl:for-each select="//node">
<xsl:sort select="@priority" order="ascending" />
...
</xsl:for-each>
Within that, you only want to output anything if the position of the node
within that sorted list is less than or equal to the number of nodes you
want in the result. In other words:
<xsl:for-each select="//node">
<xsl:sort select="@priority" order="ascending" />
<xsl:if test="position() <= number($nodes)">
<xsl:value-of select="name" />
</xsl:if>
</xsl:for-each>
Tested and works in SAXON.
I hope this helps,
Jeni
Dr Jeni Tennison
Epistemics Ltd * Strelley Hall * Nottingham * NG8 6PE
tel: 0115 906 1301 * fax: 0115 906 1304 * email: jeni.tennison@epistemics.co.uk
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list