I have a non-sorted list I want to sort, but I also want to
know when a group is new.
Try not to think so procedurally: you're not interested in when things
happen, only in how the output is functionally related to the input.
Generally with sorting-then-grouping problems I advise a two-phase
transformation, using a temporary tree (result tree fragment) as the
intermediate result. This needs the xx:node-set() extension to access
this tree in the second phase.
Michael Kay
Software AG
home: Michael(_dot_)H(_dot_)Kay(_at_)ntlworld(_dot_)com
work: Michael(_dot_)Kay(_at_)softwareag(_dot_)com
I've managed to do this using
for-each, sort and an if with a "not preceding". (Thanks to
the faq and posts in this list)
But the "not preceding" is not looking at the sorted order -
it's looking at the orginal order in the XML-file. I want it
to "search" the sorted list.
Example:
XSL:
<xsl:output method="html" />
<xsl:template match="check">
<html>
<table border="1">
<tr><th>new</th><th>i</th><th>g</th></tr>
<xsl:for-each select="news"><xsl:sort select="@i"
order="descending"/> <tr> <td><xsl:if
test="not(preceding::g=g)">*</xsl:if></td>
<td><xsl:value-of select="@i"/></td>
<td><xsl:value-of select="g"/></td>
</tr>
</xsl:for-each>
</table>
</html>
</xsl:template>
</xsl:stylesheet>
XML:
<check>
<news i="6"><g>3</g></news>
<news i="1"><g>2</g></news>
<news i="5"><g>2</g></news>
<news i="4"><g>1</g></news>
<news i="3"><g>1</g></news>
<news i="2"><g>3</g></news>
</check>
This outputs : (n = new, i=item, g=group)
n i g
* 6 3
5 2
* 4 1
3 1
2 3
* 1 2 <- i=1 is the first use of group 2 in the XML
But I want it to output :
n i g
* 6 3
* 5 2 <- i=5 is the first use of group 2 in the sorted list
* 4 1
3 1
2 3
1 2
Thanks in advance for any help!
Regards
Martin Gundersen
martin(_at_)gundersen(_dot_)com
Oslo, Norway
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list