OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

docbook-apps message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [docbook-apps] Finding which template, formatting part of a ToC


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
bobs@sagehill.net
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



[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]