This is a standard grouping problem, XSLT2 has (will have) specific
grouping constructs (group-adjacent) to make this easy but in xslt1 you
can use any grouping technique (eg those on jeni's site
http://www.jenitennison.com/xslt/grouping
eg something like
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="x">
<ul>
<xsl:apply-templates mode="toc" select="heading[1]"/>
</ul>
</xsl:template>
<xsl:template mode="toc" match="heading">
<li>
<span><xsl:value-of select="."/></span>
<xsl:if test="@level < following-sibling::heading[1]/@level">
<ul>
<xsl:apply-templates mode="toc" select="following-sibling::heading[1]"/>
</ul>
</xsl:if>
</li>
<xsl:apply-templates mode="toc"
select="following-sibling::heading[(_at_)level=current()/@level][1]"/>
</xsl:template>
</xsl:stylesheet>
<x>
<heading level="1">A main Heading</heading>
<heading level="2">Sub heading of main heading</heading>
<heading level="2">another sub heading of main heading</heading>
<heading level="1">Another main Heading</heading>
</x>
$ saxon head.xml head.xsl
<?xml version="1.0" encoding="utf-8"?>
<ul>
<li>
<span>A main Heading</span>
<ul>
<li>
<span>Sub heading of main heading</span>
</li>
<li>
<span>another sub heading of main heading</span>
</li>
</ul>
</li>
<li>
<span>Another main Heading</span>
</li>
</ul>
________________________________________________________________________
This e-mail has been scanned for all viruses by Star Internet. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________