This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
sorting and grouping - can't get it to work
- To: "'XSL-List at lists dot mulberrytech dot com'" <XSL-List at lists dot mulberrytech dot com>
- Subject: [xsl] sorting and grouping - can't get it to work
- From: Andreas Waechter <A dot Waechter at logics dot de>
- Date: Mon, 2 Jul 2001 10:00:10 +0200
- Reply-To: xsl-list at lists dot mulberrytech dot com
Hello all,
this is my last attempt to get some reaction to my question - previous
attempts to post to this list did not give me any reactions - I did not even
see my own posting to the list, perhaps this is normal (though when I
answered someones post I got my post back from the list). But I also did not
get any answer so I suspect my postings did never arrive.
Now for my question
I have a little problem with data I want to sort and then place into a
two-column table
(two of the sorted data items in each row).
I am a XML/XSL-Newbie so please forgive me if I ask a too simple question
for you experts.
Here is my problem in detail - I hope I provided all the info you need.
With data like this
<data>
<item> <name>John</name> </item>
<item> <name>Ed</name> </item>
<item> <name>Bill</name> </item>
<item> <name>Al</name> </item>
<item> <name>Tim</name> </item>
<item> <name>George</name> </item>
</data>
I want to get a sorted table with two columns like
<table>
<tr><td>Al</td><td>Bill</td></tr>
<tr><td>Ed</td><td>George</td></tr>
<tr><td>John</td><td>Tim</td></tr>
</table>
By using
<xsl:template match="data/item">
<table>
<xsl:for-each select="item[position() mod 2 = 1]">
<tr>
<xsl:apply-templates select=". |
following-sibling::item[position()=1]"/>
<xsl:if test="not(following-sibling::item[position()=1])">
<td> </td>
</xsl:if>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template match="item">
<td><xsl:value-of select="name"/></td>
</xsl:template>
I managed to get
<table>
<tr><td>John</td><td>Ed</td></tr>
<tr><td>Bill</td><td>Al</td></tr>
<tr><td>Tim</td><td>George</td></tr>
</table>
i.e. I figured out how to place two consecutive item names in two cells of
one row.
I even managed to fill the last row with an empty cell should the number of
items be odd.
I also know - in principle - how to sort (<xsl:sort select="name"/>).
I just don't know where to place the sort.
If I place it in the existing for-each I get a very confusing "order",
if I place it in the existing apply-templates, only the two items within
each rows get sorted (as I expected it)
But what I really need is that the sorting of the item takes place before I
start selecting some of them to start rows.
I looked through the FAQ under sorting, grouping and sorting and tables and
also searched the archives but did not find a solution. Forgive me if I
overlooked something.
I don't think it should matter in this case but the software I use to
interprete my XML+XSL files is the Apache module from the XALAN software
(Xalan C++ version 1.1.0).
Could anyone please help? Thanks in advance.
Andreas Waechter
Andreas Waechter Tel.: +49 (089) 55 24 04-43
Logics Software GmbH Fax: +49 (089) 55 24 04-44
Schwanthalerstr. 9-11 mailto:a.waechter@logics.de
80336 München http://www.logics.de
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list