|
Subject: [xsl] XHTML table of contents with XSLT From: "Daniel K. Schneider" <Daniel.Schneider@xxxxxxxxxxxxxx> Date: Fri, 23 Feb 2007 17:44:34 +0100 |
XHTML: Is valid transitional (has a name space declaration) and NO identity attributes or div's etc. would make the task easier. I really would like to work it with just ANY valid XHTML w/o hand-editing.
Desired RESULT: TOC with 2 or more levels, must work CLIENT side in a XHTML capable browser (e.g. Firefox).
Here is what I have so far. Problem are: * This solution ONLY works for h1,h2,etc. that have different content. E.g. you couldn't have two h2 with "example" content. * I also tried to hack something with position, but apparently position() does not return position in the global tree in the following rule.
<xsl:template match="*[local-name()='h1']" mode="toc">
<xsl:text></xsl:text><a href="#{position()}"><xsl:value-of select="."/></a><br/>
</xsl:template>Question: Do I have to copy the whole tree and insert id attibutes ? (I can learn this guess, but not sure that this is the easiest solution)
My clumsy attempt (should work with ANY xhtml file) ----- XSL -----
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"> <xsl:output
method="xml"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
indent="yes"
encoding="iso-8859-1"
/><xsl:template match="/*[local-name()='html']"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Nice title</title> </head> <body bgcolor="#FFFFFF"> <xsl:apply-templates select="*[local-name()='body']"/> </body> </html> </xsl:template>
<xsl:template match="*[local-name()='body']"> <h1>Contenu</h1> <xsl:apply-templates select="*[local-name()='h1']|*[local-name()='h2']" mode="toc"/> <!-- <xsl:apply-templates select="*[local-name()='h1']|*[local-name()='h2']|*[local-name()='h3']" mode="toc"/> --> <xsl:apply-templates /> </xsl:template>
<xsl:template match="*[local-name()='h1']" mode="toc">
<xsl:text></xsl:text><a href="#h1_{.}"><xsl:value-of select="."/></a><br/>
</xsl:template><xsl:template match="*[local-name()='h2']" mode="toc">
<xsl:text>-- </xsl:text><a href="#h2_{.}"><xsl:value-of select="."/></a><br/>
</xsl:template><!--
<xsl:template match="*[local-name()='h3']" mode="toc">
<a href="#h3_{.}"><xsl:value-of select="."/></a> -
</xsl:template>
--><xsl:template match="*[local-name()='h1']">
<h1><a name="h1_{.}"><xsl:value-of select="."/></a></h1>
</xsl:template><xsl:template match="*[local-name()='h2']">
<h2><a name="h2_{.}"><xsl:value-of select="."/></a></h2>
</xsl:template><!--
<xsl:template match="*[local-name()='h3']">
<h3><a name="h3_{.}"><xsl:value-of select="."/></a></h3>
</xsl:template>
--><xsl:template match="*">
<xsl:element name="{name(.)}">
<xsl:for-each select="@*">
<xsl:attribute name="{name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
-- Dr Daniel K.Schneider, TECFA (Educational Technologies and Learning)
TECFA (TEchnologies de Formation et Apprentissage) FPSE (Faculti de Psychologie et des Sciences de l'Education) Universiti de Genhve 54 Route des Acacias, CH-1227 Carouge
email: Daniel.Schneider@xxxxxxxxxxxxxx www: http://tecfa.unige.ch/tecfa-people/schneider.html
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] keep togethers for table-, G. Ken Holman | Thread | Re: [xsl] XHTML table of contents w, Martin Honnen |
| RE: [xsl] Splitting Excel XML table, Scott Lynch | Date | Re: [xsl] XHTML table of contents w, Martin Honnen |
| Month |