Subject: RE: First Element in Sorted List
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 2 Jun 2005 04:07:17 +0100
|
> My process needs to take action on the first element in a list of
> elements where the logic to determine first is the lowest
> numeric value
> of the sortorder attribute. I don't believe there is a
> one-line way to
> do this - I believe the entire list must be sorted, and then the
> position of each element after sort compared to determine if
> it is first.
Yes. Even in XSLT 2.0 this may be the best approach. 2.0 offers min/max
functions, but they give you the highest/lowest value, not the node having
that value.
Writing a recursive template/function might give you better performance than
sorting (linear rather than n*log(n)).
There is a one-line solution: $x[not($x/@sortorder < @sortorder)] but it's
quite likely to have poor (quadratic) performance.
You could consider using EXSLT math:highest() or math:lowest().
Or I'm sure there's something in Dimitre's box of tricks called FXSL.
Michael Kay
http://www.saxonica.com/
>
> Is there a shorter/less expensive way to code the following
>
> <xsl:for-each select="item">
> <xsl:sort select="@sortorder" data-type="number" />
> <xsl:if test="position() = 1">
> <!-- this is the first element in the sorted list -->
> </xsl:if>
> </xsl:for-each>
>
> I searched and found examples using this technique, but
> nothing really
> saying that this was the best or only approach.
>
> Thanks in advance,
>
> -John
|