xml - Indenting dynamic table of contents -
i have xml in following format:
<?xml> <chapter> <long-name>chapter 1</long-name> <!-- 1--> <chapter> <long-name>chapter a</long-name> <!-- 1.1 --> <chapter> <long-name>chapter b</long-name> <!-- 1.1.1 --> </chapter> </chapter> <chapter> <long-name>chapter c</long-name> <!-- 1.2--> </chapter> </chapter> <chapter> <long-name>chapter 2</long-name> <!-- 2 --> <chapter> <long-name>chapter d</long-name> <!-- 2.1--> </chapter> <chapter> <long-name>chapter e</long-name> <!-- 2.2--> </chapter> </chapter> </xml> 1. chapter 1 1.1 chapter 1.1.1 chapter b 1.2 chapter c 2.chapter 2 2.1 chapter d 2.2 chapter e i want create dynamic table of contents , chapters should aligned. below xslt using creating toc , works. not know how indent chapters according level.
xslt:
<xsl:template name="generatetoc"> <fo:block break-after="page"> <xsl:apply-templates select="chapter" mode="toc" /> </fo:block> </fo:block> </xsl:template> <xsl:template match="chapter" mode="toc"> <fo:block text-align-last="justify" font-style="italic" font-size="8pt" > <fo:basic-link internal-destination="{generate-id(.)}" color="blue"> <xsl:number format="1.1 " level="multiple" /> <xsl:value-of select="longname" /> <fo:leader leader-pattern="dots" /> <fo:page-number-citation ref-id="{generate-id(.)}" /> </fo:basic-link> </fo:block> <xsl:apply-templates select="chapter" mode="toc" /> </xsl:template> please indentation.
to simplify situation, let consider stylesheet text output:
xslt 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="text" encoding="utf-8"/> <xsl:template match="/xml"> <toc> <xsl:apply-templates select="chapter" mode="toc"/> </toc> </xsl:template> <xsl:template match="chapter" mode="toc"> <xsl:call-template name="indent"> <xsl:with-param name="amount" select="count(ancestor::chapter)"/> </xsl:call-template> <xsl:number format="1. " level="multiple"/> <xsl:value-of select="long-name" /> <xsl:text> </xsl:text> <xsl:apply-templates select="chapter" mode="toc" /> </xsl:template> <xsl:template name="indent"> <xsl:param name="amount"/> <xsl:param name="char" select="'	'"/> <xsl:if test="$amount"> <xsl:value-of select="$char"/> <!-- recursive call --> <xsl:call-template name="indent"> <xsl:with-param name="amount" select="$amount - 1" /> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet> applied (corrected)input of:
<?xml version="1.0" encoding="utf-8"?> <xml> <chapter> <long-name>chapter 1</long-name> <chapter> <long-name>chapter a</long-name> <chapter> <long-name>chapter b</long-name> </chapter> </chapter> <chapter> <long-name>chapter c</long-name> </chapter> </chapter> <chapter> <long-name>chapter 2</long-name> <chapter> <long-name>chapter d</long-name> </chapter> <chapter> <long-name>chapter e</long-name> </chapter> </chapter> </xml> produces following result:
1. chapter 1 1.1. chapter 1.1.1. chapter b 1.2. chapter c 2. chapter 2 2.1. chapter d 2.2. chapter e
Comments
Post a Comment