Seiteninhaltsverzeichnis am rechten Rand

Bei Concepts sollen die Überschriften jeder section am rechten Rand als kleines Inhaltsverzeichnis dieser Konzept-Seite erscheinen.

XSL-Stylesheet in der Dokumentation

Natürlich habe ich versucht, selbst XSL-Stylesheet-Anpassungen zu kreieren. Das Ergebnis: keine Fehlermeldung und kein Inhaltsverzeichnis. Bis ich in der Datei DITA-OT\xsl\xslhtml\dita2htmlImpl.xsl auf den Eintrag

<xsl:template name="gen-user-sidetoc">

stieß. Schnell danach gegoogelt und hier die Rettung in der neuen Toolkit-Dokumentation und einem XSL-Tutorial gefunden. Hier das Beispielskript vom DITA-OT:

<!-- override for main stub -->
<xsl:template name="gen-user-sidetoc">
<!-- if there are nested topics... --> 
<xsl:if test="descendant::*[contains(@class,' topic/topic ')]">
<p><table width="150" align="right" border="1" frame="box" rules="none">
<tr><td height="5" bgcolor="#0033CC" align="center"> 
<b><font color="#FFFFFF">Contents:</font></b></td></tr>
<xsl:for-each select="descendant::*[contains(@class,' topic/topic ')]">
<xsl:variable name="ttext"><xsl:value-of select="*[contains(@class,' topic/title ')]"/>
</xsl:variable> <tr><td class="toc">
- <a href="#{generate-id()}"><xsl:value-of select="$ttext"/></a>
<!--recursive call for subtopics here"/--> </td></tr>
</xsl:for-each></table></p></xsl:if>
</xsl:template>

XSL-Stylesheet individuell anpassen

Durch trial and error habe ich das Template derart angepaßt, dass immer nur in Concepts rechts oben ein Seiteninhaltsverzeichnis erscheint, welches die section titles - sprich die Überschriften zu jeder Sektion - auflistet.


sectiontoc Beispiel
Abbildung 1. Die Sektionsüberschriften am rechten Rand des Concepts
<xsl:template name="gen-user-sidetoc">
<xsl:if test="descendant::*[contains(@class,' topic/section ')]/*[contains(@class,' topic/title ')]">
<p><table class="table" width="200" align="right" border="0">
<tr><td class="tablehead" align="center">Seitenübersicht</td></tr>
<xsl:for-each select="descendant::*[contains(@class,' topic/section ')]/*[contains(@class,' topic/title ')]">
<xsl:value-of select="*[contains(@class,' topic/title ')]"/>
<tr><td><a href="#{generate-id()}"><xsl:value-of select="text()"/></a></td></tr>
</xsl:for-each>
</table></p>
</xsl:if>
</xsl:template>

Anker generieren

Es mußte noch ein Template her, um Namensanker zu erstellen.

<xsl:template name="id">
<a name="{generate-id()}"/>
</xsl:template>

Dieses Anker-Template muss nun innerhalb des Template für die section-titles aufgerufen werden, damit in jeder section ein Namensanker generiert wird:

<xsl:call-template name="id"/>

Stylesheet auslagern in ein Plugin

Damit die geänderte Datei dita2htmlImpl.xsl nicht beim nächsten DITA-OT-Update verloren geht, ist es ratsam, das gen-user-sidetoc-Template in ein Plugin auszulagern.

Sections und EPUB

Bei der Generation von EPUB-Dateien wirkt jedoch die Section-Übersicht am rechten Rand als störend. Dann ist es besser, einfach den Plugin-Ordner herauszunehmen bzw. umzubenennten.

Links zum Artikel

  1. DITA-OT Dokumentation - Stubs for user-proviede override extensions, zum Link
  2. Scriptorium.com - Hacking the DITA OT, zum Link