xsl-list
[Top] [All Lists]

Re: [xsl] sorting, xslt 2.0

2021-03-16 11:28:33
There's another option which I forgot about because I tend to prefer one of the 
others: compute the sort key in the body of xsl:sort:

<xsl:for-each select="term">
 <xsl:sort>
  <xsl:choose>
    <xsl:when test="fr/@sort">
       <xsl:value-of select="fr/@sort"/>
    </xsl:when>
    <xsl:otherwise>
       <xsl:value-of select="(lower-case(substring(fr,1,1)))"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:sort>

On 16 Mar 2021, at 16:24, Michael Kay mike(_at_)saxonica(_dot_)com 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:

As David C and Martin suggest, write the sort key computation as a single 
XPath expression if you can.

In the rare cases where you can't, call out to a function: compute the sort 
key in a separate xsl:function, and call the function in xsl:sort/@select.

Michael Kay
Saxonica 

On 16 Mar 2021, at 16:08, Dave Pawson dave(_dot_)pawson(_at_)gmail(_dot_)com 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:

xml

<term>
<fr sort="">sourire</fr>
...
</term>

context is term
I want to sort on fr/@sort
or (if empty)
<xsl:value-of select="(lower-case(substring(fr,1,1)))"/>

error XTSE0010 Within xsl:for-each, xsl:sort elements must come before
other instructions

<xsl:for-each select="term">
 <xsl:variable name='sort'>
  <xsl:choose>
    <xsl:when test="fr/@sort">
<xsl:value-of select="fr/@sort"/>
    </xsl:when>
    <xsl:otherwise>
<xsl:value-of select="(lower-case(substring(fr,1,1)))"/>
</xsl:otherwise>
  </xsl:choose>
  </xsl:variable>


<xsl:sort select="$sort"/>


Any suggestions for a workaround please?

TiA


-- 
Dave Pawson
XSLT XSL-FO FAQ.
Docbook FAQ.




--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--


<Prev in Thread] Current Thread [Next in Thread>