Re: Finding which template, formatting part of a ToC

Bob Stayton <[email protected]>
Newsgroups gmane.text.docbook.apps
Message-ID <[email protected]>
Hi Jennifer,

Can you tell me what version of DocBook XSL your customization is based 
on?  The <p class="toc"> element was replaced by <div class="toc"> quite 
awhile ago.

In general, the way it works is that the document is processed again in 
mode="toc".  Instead of the normal processing of an element to format 
its content, the mode="toc" processes the element to generate just an 
entry in the TOC for that element by formatting its title inside an <a> 
link whose @href points to that element's content.  You'll find in 
html/autotoc.xsl a set of templates matching on different elements and 
with the attribute mode="toc", such as this one:

<xsl:template match="preface|chapter|appendix|article" mode="toc">
   <xsl:param name="toc-context" select="."/>

   <xsl:call-template name="subtoc">
     <xsl:with-param name="toc-context" select="$toc-context"/>
     <xsl:with-param name="nodes" select="section|sect1
|bridgehead[$bridgehead.in.toc != 0]"/>
   </xsl:call-template>
</xsl:template>

The $nodes parameter is a list of the children of the current element 
that should be included as a sublist under that element's TOC line.

The template that does all the work is named "subtoc".  It is in subtoc 
where you will find the code that generates a line in the TOC:

<a>
       <xsl:attribute name="href">
         <xsl:call-template name="href.target">
           <xsl:with-param name="context" select="$toc-context"/>
         </xsl:call-template>
       </xsl:attribute>
       <xsl:apply-templates select="." mode="title.markup"/>
</a>

The order of processing in subtoc is a bit confusing, because it 
processes the children first into a temporary subtoc.list variable, then 
outputs the TOC line followed by that subtoc list variable.

The handling of <dl> has always been a bit inconsistent across browser 
versions.  In more recent versions of the stylesheet there is a 
stylesheet param named 'toc.list.type' which lets you replace 
<dl><dd><dt> with <ul><li>.  You can use CSS to turn off the bullets for 
the <ul> list.    Does your version of html/autotoc.xsl have a line like 
this:

               <xsl:element name="{$toc.list.type}">

If so, then you can replace <dl>, which might solve some of your 
formatting problem.

Bob Stayton
[email protected]

On 6/30/2020 10:38 AM, Jennifer Moore wrote:
> Hi folks
>
> On a hunt for which template I need to tweak for a table of contents 
> in an article.  A clue or two from someone more expert would help!
>
> Context is, I've got an old copy of oXygen, and I use some 
> slightly-customised XSL to convert DocBook 5 to HTML, for blog posts.
>
> I haven't needed to change any of the XSL for some years now, so I'd 
> semi-forgotten what I used to know about that when I set it up - which 
> even at the time was not a huge amount - but have re-reminded myself 
> of some, by re-reading bits of Bob's book and posts I made to the 
> lists at the time :-)
>
> Today's problem:
>
> When writing articles, usually I've used <section>.  Now I've added 
> <section> within <section>.
>
> In the auto-generated HTML table of contents, the layout now isn't 
> quite right - it's adding some line breaks I don't want, and losing 
> the font size part way through.
>
> So I thought I'd get into the template and see what it's doing, and 
> see if I can work out how to adjust it to my liking.
>
> Step 1, find out which template is doing that bit!
>
> The post-transform HTML contains some <dd> tags to create an indent 
> for the lower-level sections, which seems like it could be a clue as 
> to what the relevant bit of XSL will look like when I find it.  So I 
> tried searching on <dd>.  But it turns out <dd> appears in quite a lot 
> of the XSL files, so that's not enough of a clue for me to work out 
> which one :-)
>
> I do know which template is _calling_ the bit I'm interested in:
>
> <xsl:template name="make.toc">
>
> It sets up the "outer layer" of the ToC, and it's in an 
> already-slightly-customised file for ToCs which is an adaptation of, I 
> think, autotoc.xsl.
>
> By looking at this previously-customised make.toc, and sticking in 
> some dummy classes to see what appeared where in the HTML, I was able 
> to deduce that the part of it that's actually doing the work (in this 
> case) is this:
>
> <xsl:otherwise>
>   <xsl:if test="$nodes">
>     <p class="toc">
>       <xsl:copy-of select="$toc.title"/>
>       <xsl:apply-templates select="$nodes" mode="toc">
>         <xsl:with-param name="toc-context" select="$toc-context"/>
>       </xsl:apply-templates>
>     </p>
>   </xsl:if>
> </xsl:otherwise>
>
> If I understand correctly, apply-templates is what tells the middle 
> bit of the ToC to be assembled by a different template somewhere else, 
> or several different templates.
>
> I get that the with-param tag is passing a variable through to the 
> other templates.
>
> select="$nodes" mode="toc" is unfamiliar to me, I'm not sure what 
> that's doing.
>
> Logically, I assume that somewhere along the way, as well as creating 
> the layout of the list, it's also taking the <title> and the xml:id of 
> each <section>, and using those to assemble a link.  That bit of 
> transformation could be happening in a different template from the one 
> I need to tweak, though.
>
> Any clues about finding it?
>
> Thanks!
>
> Jennifer
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.