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>&#10;</xsl:text>     <xsl:apply-templates select="chapter" mode="toc" /> </xsl:template>  <xsl:template name="indent">     <xsl:param name="amount"/>     <xsl:param name="char" select="'&#9;'"/>     <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

Popular posts from this blog

user interface - How to replace the Python logo in a Tkinter-based Python GUI app? -

objective c - Greedy NSProgressIndicator Allocation -

how to set an OCR language in Google Drive -