Automatisches Einfügen durch Profiling

(Auszug aus "DocBook-XML: Medienneutrales und plattformunabhängiges Publizieren" von Thomas Schraitle)

Profiling eignet sich in erster Linie dafür, Dinge zu entfernen. Allerdings lassen sich durch Profiling auch Dinge automatisch einfügen. Dieser Abschnitt beschreibt die Methode für beide Versionen (DocBook 4 und DocBook 5).

Angenommen, Sie besitzen in Ihrem Dokument Umgebungsvariablen, die im Index erscheinen sollen. Eine Möglichkeit ist, jeden Indexeintrag durch indexterm händisch einzutragen. Dies ist mühsam, zeitraubend und fehleranfällig. Eine klügere Alternative ist der Einsatz von Profiling: Hierbei wird jedem envar-Element ein indexterm automatisch beigefügt. Gehen Sie wie folgt vor:

  1. Verwenden des envar-Elements
    Verwenden Sie das Element envar, um Ihre Umgebungsvariablen zu markieren. Standardmäßig werden alle envar-Elemente indiziert. Für solche, die nicht im Index erscheinen sollen, fügen Sie das Attribut condition mit dem Wert noindex ein.
  2. Anlegen des Stylesheets für das automatische Einfügen
    Erstellen Sie ein Stylesheet profile-tags.xsl mit folgendem Eintrag:
  • Für DocBook 4:
<xsl:stylesheet version="1.0" xmlns:exsl="http://exslt.org/common" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="exsl">
    <xsl:template name="check.index">
        <xsl:param name="node" select="."/> 
        <xsl:choose> 
            <xsl:when test="$node/@condition = 'noindex'">0</xsl:when> 
            <xsl:when test="$node/@condition = 'index'">1</xsl:when> 
            <xsl:otherwise>1</xsl:otherwise> 
        </xsl:choose> 
    </xsl:template> 
    <xsl:template match="envar" mode="profile"> 
        <xsl:variable name="do.index"> 
            <xsl:call-template name="check.index"/> 
        </xsl:variable> 
        <xsl:variable name="profile.node.rtf"> 
            <xsl:apply-imports/> 
        </xsl:variable> 
        <xsl:variable name="profile.node" select="exsl:node-set($profile.node.rtf)/*"/> 
        <xsl:if test="$profile.node != 0">
            <xsl:copy-of select="$profile.node"/> 
            <xsl:if test="$do.index != 0"> 
                <indexterm> 
                    <primary>Umgebungsvariablen</primary> 
                    <secondary> 
                        <xsl:value-of select="."/> 
                    </secondary> 
                </indexterm> 
            </xsl:if> 
        </xsl:if> 
    </xsl:template> 
    <xsl:template match="footnote|indexterm" mode="profile">
        <xsl:variable name="profile.node.rtf"> 
            <xsl:apply-imports/> 
        </xsl:variable> 
        <xsl:variable name="profile.node" select="exsl:node-set($profile.node.rtf)/*"/> 
        <xsl:if test="$profile.node != 0"> 
            <xsl:copy-of select="."/> 
        </xsl:if> 
    </xsl:template> 
</xsl:stylesheet>

Zeile 1: Enthält im Wurzelelement xsl:stylesheet die Namensraumdeklarationen für XSLT und EXSLT. Letztere wird für die Erweiterungsfunktion exsl:node-set benötigt.
Zeile 2: Überprüft, ob das Attribut condition vorhanden ist. Abhängig davon und ob es einen Wert index oder noindex enthält, wird 0 oder 1 zurückgegeben.
Zeile 10: Template-Regel für das Element envar. Dies muss im Modus profile ausgeführt werden, damit es von dem Profiling-Stylesheet erkannt wird.
Zeile 11: Speichert in der Variablen do.index das Ergebnis des Aufrufes von check.index.
Zeile 14: Wendet durch xsl:apply-imports die ursprüngliche Template-Regel an. Das heißt, je nach Profiling-Attribut bleibt das Element erhalten oder wird entfernt. Nur wenn das Element entfernt wurde, ist das result tree fragment (RTF) leer.
Zeile 17: Wandelt das vorherige RTF in eine Knotenmenge um. Dies wird benötigt, um auf den Inhalt der Variablen profile.node.rtf XPath-Ausdrücke anzuwenden.
Zeile 18: Testet, ob das Element durch Profiling erhalten geblieben ist. Ist dies der Fall, wird es in die Ausgabe übernommen. Die zweite Abfrage überprüft, ob der automatische Indexeintrag hinzugefügt werden soll.
Zeile 30: Passt auf Fußnoten und Indexeinträge, die eine Sonderbehandlung benötigen. In beiden Fällen dürfen keine Indexeinträge vorhanden sein. Dies wäre der Fall, wenn in einem footnote ein envar-Element enthalten ist (entsprechendes gilt für indexterm). Sind entweder footnote oder indexterm durch das Profiling erhalten geblieben, werden sie kopiert.

  • Für DocBook 5 ist das Stylesheet vom Aufbau identisch, lediglich die Präfixe und der Namensraum für DocBook 5 sind einzufügen:
<xsl:stylesheet version="1.0" xmlns:d="http://docbook.org/ns/docbook" xmlns="http://docbook.org/ns/docbook" xmlns:exsl="http://exslt.org/common" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="exsl"> 
    <xsl:template name="check.index"> 
        <xsl:param name="node" select="."/> 
        <xsl:choose> 
            <xsl:when test="$node/@condition = 'noindex'">0</xsl:when> 
            <xsl:when test="$node/@condition = 'index'">1</xsl:when> 
            <xsl:otherwise>1</xsl:otherwise> 
        </xsl:choose> 
    </xsl:template> 
    <xsl:template match="d:envar" mode="profile"> 
        <xsl:variable name="do.index"> 
            <xsl:call-template name="check.index"/> 
        </xsl:variable> 
        <xsl:variable name="profile.node.rtf"> 
            <xsl:apply-imports/> 
        </xsl:variable> 
        <xsl:variable name="profile.node" select="exsl:node-set($profile.node.rtf)/*"/> 
        <xsl:if test="$profile.node != 0"> 
            <xsl:copy-of select="$profile.node"/> 
            <xsl:if test="$do.index != 0"> 
                <d:indexterm> 
                    <d:primary>Umgebungsvariablen</d:primary> 
                    <d:secondary> 
                        <xsl:value-of select="."/> 
                    </d:secondary> 
                </d:indexterm> 
            </xsl:if> 
        </xsl:if> 
    </xsl:template> 
    <xsl:template match="d:footnote|d:indexterm" mode="profile"> 
        <xsl:variable name="profile.node.rtf"> 
            <xsl:apply-imports/> 
        </xsl:variable> 
        <xsl:variable name="profile.node" select="exsl:node-set($profile.node.rtf)/*"/> 
        <xsl:if test="$profile.node != 0"> 
            <xsl:copy-of select="."/> 
        </xsl:if> 
    </xsl:template> 
</xsl:stylesheet>
  1. Anlegen des Stylesheets für Zwei-Schritt-Profiling
    Das im vorigen Schritt erzeugte Stylesheet muss in ein übergeordnetes Stylesheet eingefügt werden, um sowohl Ein-Schritt- als auch Zwei-Schritt-Profiling zu verwenden:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:import href="DBBASISURI/profiling/profile.xsl"/>
    <xsl:output indent="yes" method="xml"/>
    <xsl:include href="profile-tags.xsl"/>
</xsl:stylesheet>

Zeile 2: Importieren Sie das Original-Stylesheet für Profiling. Ersetzen Sie den Platzhalter DBBASISURI entsprechend Ihrer verwendeten DocBook-Version.
Zeile 3: Optionales Element für die Ausgabe. Standardmäßig wird keine DOCTYPE-Deklaration eingefügt. Wenn Sie für DocBook 4 eine bevorzugen, erweitern Sie das Element durch die Attribute doctype-public und doctype-system und tragen Sie die entsprechende Werte ein.
Zeile 4: Fügen Sie Ihre Anpassungen von der Datei profile-tags.xsl ein.

  1. Anlegen des Stylesheets für Ein-Schritt-Profiling
    Verwenden Sie folgendes Stylesheet (profile-docbook-html.xsl), um HTML auszugeben:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:import href="DBBASISURI/html/profile-docbook.xsl"/> 
    <xsl:include href="profile-tags.xsl"/> 
</xsl:stylesheet>

Am Beispiel eines DocBook 5-Dokuments soll dies gezeigt werden:

<article version="5.0" xml:lang="de" xmlns="http://docbook.org/ns/docbook">
    <title>Profiling-Test 01</title>
    <para>Umgebungsvariable <envar>XML_CATALOG_FILES</envar>.</para>
    <para>Umgebungsvariable <envar condition="noindex">FOO</envar>.</para>
    <para>Umgebungsvariable <envar os="win">Path</envar><envar os="lin">PATH</envar></para>
    <index/>
</article>

Um zu demonstrieren, wie die Stylesheets wirken, wird angenommen, dass eine Dokumentation für Linux gewünscht wird. Rufen Sie auf: 

xsltproc --stringparam profile.os "lin" profile.xsl article.xml 

Sie erhalten:

<article xmlns="http://docbook.org/ns/docbook" xml:lang="de" version="5.0">
    <title>Profiling-Test 01</title>
    <para>Umgebungsvariable <envar>XML_CATALOG_FILES</envar><indexterm><primary>Umgebungsvariablen</primary><secondary>XML_CATALOG_FILES</secondary></indexterm>.</para>
    <para>Umgebungsvariable <envar condition="noindex">FOO</envar>.</para>
    <para>Umgebungsvariable <envar os="lin">PATH</envar><indexterm><primary>Umgebungsvariablen</primary><secondary>PATH</secondary></indexterm></para>
    <index/>
</article> 

Wie Sie sehen, ist das envar-Element mit win im Attribut os herausgefiltert worden. Zusätzlich wurden automatisch Indexeinträge eingefügt, außer für FOO.

Diese Methode eignet sich ebenso für andere Elemente, die Sie automatisch indizieren möchten wie abbrev, acronym, person/ personname und andere.

  

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema DocBook bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2009 Millin Verlag
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "DocBook-XML: Medienneutrales und plattformunabhängiges Publizieren" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

Millin Verlag, Siebengebirgsring 36, 53797 Lohmar, info(at)millin.de