xsl-list
[Top] [All Lists]

Re: [xsl] Sort list by a combination of elements

2006-12-21 06:42:32

Solution: Normally one would write something like <xsl:sort
select="//book/author" />. In this case, I found a solution by
concatenating: <xsl:sort select="concat( //book/author, //series[ @id =
current()/belongs_to/@ref ]/author )" />. This works, BUT it "feels like
a hack", if you know, what I mean.

in both cases you wouldn't want to start the xpaths with // otherwise
all elements would get the same sort key (as these are absolute paths
not depending on the element being sorted)


I would prefer a more XSLT-like solution, that determines, if there is
an <author> element, sorts by this and uses the <series> author as a
fallback. Does anyone know, if and how this could be done? Schematically:

in xslt2
<xsl:key name="series" match="series" use="@id"/>
...

<xsl:for-each select="book">
<xsl:sort select="(author,key('series',belongs_to_ref)/author)[1]"/>

in xslt1

<xsl:key name="series" match="series" use="@id"/>
...

<xsl:for-each select="book">
<xsl:sort select="(author|key('series',belongs_to_ref)/author)[last()]"/>

The xslt2 version does exactly what you ask, thehe xslt 1 version has
the additional restriction (that could be removed) that if a book has
both an author and a series ref, that the series element appears before
the book in document order.

David



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

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