El problema

He terminado mi manual con DocBook y ahora quiero añadirle una cabecera extra y unos banners de adsense de google.

DocBook no tiene ninguna etiqueta que permita hacer una llamada tipo "include", de manera que se pueda incluir el contenido de un fichero de texto, o html, para repetir en todas las páginas una cabecera, un logo, o cualquier elemento que queramos que aparezca siempre.

La solución

Editar la hoja de estilo que controla la transformación de xml en html.

En mi caso la hoja de estilo a editar es " /usr/share/xml/docbook/stylesheet/nwalsh/html/chunk-common.xls"

Localizo el bloque etiquetado como <body> que tiene el siguiente contenido:

 

<body>

<xsl:call-template name="body.attributes"/>
<xsl:call-template name="user.header.navigation"/>

<xsl:call-template name="user.header.content"/>

<xsl:call-template name="header.navigation">
<xsl:with-param name="prev" select="$prev"/>
<xsl:with-param name="next" select="$next"/>
<xsl:with-param name="nav.context" select="$nav.context"/>
</xsl:call-template>

<xsl:copy-of select="$content"/>

<xsl:call-template name="user.footer.content"/>

<xsl:call-template name="footer.navigation">
<xsl:with-param name="prev" select="$prev"/>
<xsl:with-param name="next" select="$next"/>
<xsl:with-param name="nav.context" select="$nav.context"/>
</xsl:call-template>

<xsl:call-template name="user.footer.navigation"/>
</body>

 

Introduzco las líneas en negrita:

<body>

<xsl:call-template name="body.attributes"/>
<xsl:call-template name="user.header.navigation"/>

<xsl:call-template name="user.header.content"/>

<xsl:call-template name="header.navigation">
<xsl:with-param name="prev" select="$prev"/>
<xsl:with-param name="next" select="$next"/>
<xsl:with-param name="nav.context" select="$nav.context"/>
</xsl:call-template>

  <xsl:call-template name="user.header.content2"/>
<xsl:call-template name="user.header.content4"/>

<xsl:copy-of select="$content"/>

<xsl:call-template name="user.header.content3"/>

<xsl:call-template name="user.footer.content"/>

<xsl:call-template name="footer.navigation">
<xsl:with-param name="prev" select="$prev"/>
<xsl:with-param name="next" select="$next"/>
<xsl:with-param name="nav.context" select="$nav.context"/>
</xsl:call-template>

<xsl:call-template name="user.footer.navigation"/>
</body>

Localizo la zona en la que aparece " <xsl:template name="header.navigation">" y por encima de ella introduzco el siguiente código:

<xsl:template name="user.header.content">
<xsl:variable name="codefile" select="document('mycode.html',/)"/>
<xsl:copy-of select="$codefile/node()"/>
</xsl:template>

<xsl:template name="user.header.content2">
<xsl:variable name="codefile" select="document('mycode2.html',/)"/>
<xsl:copy-of select="$codefile/node()"/>
</xsl:template>

<xsl:template name="user.header.content3">
<xsl:variable name="codefile" select="document('mycode3.html',/)"/>
<xsl:copy-of select="$codefile/node()"/>
</xsl:template>

<xsl:template name="user.header.content4">
<xsl:variable name="codefile" select="document('mycode4.html',/)"/>
<xsl:copy-of select="$codefile/node()"/>
</xsl:template>

Qué es lo que he hecho?

La inclusión dentro del bloque <body> de las tres líneas remarcadas en negrita hace que, al procesarse el fichero xml, según se termina la generación de la cabecera de navegación se ejecuta el template "user.header.content2" y, a continuación de éste, el template "user.header.content4".

El procesador llama ahora al template "$content" y continúa con  el "user.header.content3" para continuar con el procesado estándar de la página.

El siguiente paso que hemos hecho, ha sido crear los templates que van a ser llamados, introduciendo en ellos dos sentencias.

La primera, abre un fichero llamado mycode.html, mycode2.html, mycode3.html o mycode4.html,según el caso.

La segunda, extrae y copia del fichero anteriormente abierto la información que contiene. Importante: la sintáxis de esta sentencia asume que todo el contenido del fichero está incluido en un único nodo, por lo que resulta conveniente encerrarlo entre etiquetas <div>.

A partir de ahora, el contenido de los ficheros "mycode.." se incluirá dentro de todas las páginas que se generen.

Puedes ver un ejemplo en mi manual de conectividad . Tante el banner de Tux, como la publicidad de Google han sido incluidos con esta técnica.