Remarque

Nous utiliserons Oracle pour notre exemple sachant que cela est applicable à d'autres bases de données en modifiant un peu les scripts.

Problématique

Lorsqu'on travail avec une base de données, il peut être utilse de disposer d'un dictionnaire de données. S'il existe des logiciels pour faire cela, ils sont malheureusement souvent chers ou pas très performants. Et puis il faut installer une n-ième application.

De plus, les informations récupérées ne sont pas toujours exportables. Il serait bien, en effet, de pouvoir récupérer ces informations et de les utiliser simplement dans les documents techniques (word, excel, openoffice, etc.).

Pour cela, rien de plus simple : il faut utiliser docbook.

Solution

Requête d'extraction

La première chose à faire est d'extraire les données nécessaire à partir du dictionnaire de données Oracle. Le format de sortie choisi est un format XML qui sera ensuite transformé en docbook par une feuille de style (XSL) :

set pagesize 0
set linesize 3000
set colsep ';'
set feedback off
set trimspool on
set trimout on
set termout off
set tab off
set verify off

spool ../data/descoftables.xml

select '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>' from dual;
select '<Detail>' from dual;
select '<ListOfTables>' from dual;
--Extraction de la liste des tables
select '<Table name="'||dba_tables.table_name||'" owner="'||dba_tables.owner||'">'||
'<Comment>'||dba_tab_comments.comments||'</Comment></Table>'
from dba_tables,
dba_tab_comments
where dba_tables.owner='MON_USER'
and dba_tables.table_name like '%MOTIF%'
and dba_tab_comments.owner=dba_tables.owner
and dba_tab_comments.table_name=dba_tables.table_name;

select '</ListOfTables>' from dual;
select '<DescOfTables>' from dual;
--Extraction de la description des tables
select 
'<Column id="'||dba_tab_columns.COLUMN_ID||'" tablename="'||dba_tab_columns.TABLE_NAME||'">'||
'<Name>'||dba_tab_columns.COLUMN_NAME||'</Name>'||
'<DataType>'||dba_tab_columns.DATA_TYPE||'</DataType>'||
'<DataLength>'||dba_tab_columns.DATA_LENGTH||'</DataLength>'||
'<DataPrecision>'||dba_tab_columns.DATA_PRECISION||'</DataPrecision>'||
'<DataScale>'||dba_tab_columns.DATA_SCALE||'</DataScale>'||
'<Comments>'||dba_col_comments.COMMENTS||'</Comments></Column>'
from 
dba_tab_columns,
dba_col_comments
where dba_tab_columns.owner='MON_USER'
and dba_tab_columns.table_name like '%MOTIF%'
and dba_tab_columns.owner=dba_col_comments.owner
and dba_tab_columns.table_name=dba_col_comments.table_name
and dba_tab_columns.column_name=dba_col_comments.column_name
order by dba_tab_columns.TABLE_NAME,dba_tab_columns.COLUMN_ID;

select '</DescOfTables>' from dual;
select '</Detail>' from dual;
spool off

exit

Il ne reste plus qu'à exécuter cette requête (avec sqlplus, par exemple). Elle va générer un fichier descoftables.xml.

Cette requête peut être améliorée en passant le nom de la table ou des tables en paramètre.

Transformation en docbook

Ce fichier XML est manipulé pour être conforme aux spécifications docbook. Pour cela, nous réalisons une feuille de style qui va permettre la tranformation :

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output
method="xml"
encoding="iso-8859-1"
doctype-public="-//OASIS//DTD DocBook XML V4.5//EN"
doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
indent="yes"/>

<xsl:template match="/">

<book>
<bookinfo>
<title>Description de tables</title>

<author>
<firstname>Mon prénom</firstname>
<surname>Mon nom</surname>
<affiliation>
<orgname>ma petite entreprise</orgname>
</affiliation>
</author>

<pubdate>22/01/2009</pubdate>
</bookinfo>

<chapter>
<title>Liste des tables</title>

<xsl:for-each select="Detail/ListOfTables/Table">
<para>
<xsl:value-of select="@name"/>
</para>
</xsl:for-each>

</chapter>

<chapter>
<title>Description</title>

<xsl:for-each select="Detail/ListOfTables/Table">
<xsl:variable name="table" select="@name"/>
<section>
<title>Table <xsl:value-of select="$table"/></title>

<table>
<title><xsl:value-of select="$table"/></title>

<tgroup cols="3">

<thead>
<row>
<entry align="center">Colonne</entry>
<entry align="center">Type</entry>
<entry align="center">Description</entry>
</row>
</thead>

<tbody>
<xsl:for-each select="../../DescOfTables/Column[@tablename= $table]">
<row>
<entry><xsl:value-of select="Name"/></entry>
<entry><xsl:value-of select="DataType"/>(<xsl:value-of select="DataLength"/>)</entry>
<entry><xsl:value-of select="Comments"/></entry>
</row>
</xsl:for-each>
</tbody>
</tgroup>
</table>

</section>
</xsl:for-each>

</chapter>
</book>

</xsl:template>

</xsl:stylesheet>

Il faut maintenant appliquer la feuille de style au fichier XML. Pour cela, il faut passer les fichiers dans un processeur XSL. Par exemple, avec msxsl.exe (Microsoft) :

msxsl.exe descoftables.xml desc2docbook.xsl -o docbook.xml

et nous obtenons un beau fichier docbook. Nous pouvons ainsi le transformer en autres choses.

Pour aller plus loin

Transformation en fichier FO

L'un des intérêt du format docbook est qu'il dispose de nombreuses feuilles de style pour le transformer. Par exemple, nous pouvons le trransformer en FO grâce à une feuille de style XSL-FO. Cette feuille de style est disponible sur le site officiel docbook. Si l'on télécharge par exemple fichier docbook-xsl-1.74.0.zip, ce fichier, un fois décompressé contient un répertoire fo proposant un ensemble de transformation dont une qui nous intéresse plus particulièrement : docbook.xsl.

Pour utiliser cette feuille de style et générer du fo, il suffit alors de faire passer le processeur sur le fichier docbook en lui applicant le style en question :

msxsl.exe E:\docbook\docbook.xml E:\docbook-xsl-1.74.0\docbook-xsl-1.74.0\fo\docbook.xsl -o descoftables.fo

Transformation en PDF, PS, etc.

A partir du fichier FO, il est possible de générer un quantité de fichiers dans différents formats. Pour cela, il va nous falloir FOP, une extension java développée par apache.org et disponible sur leur site. Une fois les binaires FOP téléchargés et décompressés (ou générés à partir des sources compilées), il suffit d'appeler le processeur XSLT:

java -jar E:\fop-0.95-bin\fop-0.95\build\fop.jar -fo H:\www\docbook\descoftables.fo -pdf H:\www\docbook\descoftables.pdf

pour obtenir du PDF ;

java -jar E:\fop-0.95-bin\fop-0.95\build\fop.jar -fo H:\www\docbook\descoftables.fo -ps H:\www\docbook\descoftables.ps

pour obtenir du postscript ;

java -jar E:\fop-0.95-bin\fop-0.95\build\fop.jar -fo H:\www\docbook\descoftables.fo -rtf H:\www\docbook\descoftables.rtf

pour obtenir du RTF ; etc.

Remarque

Dans le cas d'une documentation technique, le document d'origine peut contenir certains tableaux. Or, RTF ne gère pas les tableaux. Dans ce cas, il faut se tourner vers un autre format. Le format le plus aisé à échanger en cas de problème est le HTML.

Transformation docbook en word (wordml)

Encore plus simple que PDF ou PS. le paquet docbook-xsl contient un répertoire roundtrip dans lequel l'on trouve tout ce qui est nécessaire pour transformer du docbook en word (wordml) et inversement. Pour cela, il faut commencer par modifier le fichier de paramètres param.xsl :

<xsl:param name="wordml.template"/>

en :

<xsl:param name="wordml.template">template.xml</xsl:param>

Ensuite, il ne reste plus qu'à lancer le processeur XSL sur le fichier docbook en entrée :

msxsl.exe E:\monfichier-dbk.xml E:\docbook-xsl-1.74.0\roundtrip\dbk2wordml.xsl -o E:\monfichier-dbk.xml

Vous disposez alors d'un fichier word au format wordml, que l'on peut ouvrir avec Microsot Word (ou OpenOffice).

Pour plus de détails, veuillez vous reporter directement à l'article correspondant.