Génération de HTML


Nous avons jusqu'à maintenant opéré des transformations d'arbres XML. Nous avions un document XML en entrée et produisions un document XML différent en sortie, basé sur des informations contenues dans le document initial.
Il est également possible de produire en sortie des documents au format html. Supposons que nous ayons, comme au premier exemple, la sortie XML d'un étiqueteur :
<?xml version="1.0" encoding="iso-8859-1"?>
<doc>
    <taggersent>
        <taggertoken wordform="Il" lemma="il" pos="PRO"/>
        <taggertoken wordform="était" lemma="être" pos="VER:sg"/>
        <taggertoken wordform="une" lemma="un" pos="DET:femi:sg"/>
        <taggertoken wordform="fois" lemma="fois" pos="NOM:femi:sg"/>
        <taggertoken wordform="," lemma="," pos="PUN"/>
        <taggertoken wordform="les" lemma="le" pos="DET:masc:pl"/>
        <taggertoken wordform="voleurs" lemma="voleur" pos="NOM:masc:pl"/>
        <taggertoken wordform="étaient" lemma="étayer|être" pos="VER:pl"/>
        <taggertoken wordform="dans" lemma="dans" pos="PRP"/>
        <taggertoken wordform="la" lemma="le" pos="DET:femi:sg"/>
        <taggertoken wordform="forêt" lemma="forêt" pos="NOM:femi:sg"/>
        <taggertoken wordform="." lemma="." pos="PUN"/>
    </taggersent>
    <taggersent>
        <taggertoken wordform="Ils" lemma="il" pos="PRO"/>
        <taggertoken wordform="étaient" lemma="étayer|être" pos="VER:pl"/>
        <taggertoken wordform="tous" lemma="tout" pos="PRO"/>
        <taggertoken wordform="assis" lemma="asseoir" pos="VER:pper:masc:pl"/>
        <taggertoken wordform="autour" lemma="autour" pos="ADV"/>
        <taggertoken wordform="du" lemma="du" pos="PRP:DET:masc:sg"/>
        <taggertoken wordform="feu" lemma="feu" pos="NOM:masc:sg"/>
        <taggertoken wordform="." lemma="." pos="PUN"/>
    </taggersent>
</doc>
et que nous voulions visualiser ce document de la manière suivante :
  • en séparant les phrases et en les numérotant ;
  • en numérotant les items dans la phrase (numéro de l'item préfixé par le numéro de la phrase) ;
  • en représentant pour chaque élément sa forme et sa fonction ;
  • en colorant en rouge les formes au pluriel et en vert celles au singulier ;
  • et, pour faire sobre, en faisant clignoter les formes pour lesquelles il y a ambigüité sur le lemme.

C'est à dire quelque chose comme ça...
Pour information, le code HTML ressemble à ça...
La feuille de style qui a spécifié cette tansformation (XML vers HTML) est la suivante :
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>

<xsl:template match="/">
    <html>
        <head>
        <title>
Les voleurs sous TreeTagger</title>
    </head>
    <body>
        <h1>
Liste des tokens</h1>

        <!-- Pour toutes les phrases, on génère une table -->
        <xsl:for-each select="//taggersent">
            <xsl:variable name="numPhrase"><xsl:value-of select="position ()"/></xsl:variable>
            <table style="border:solid black 1px">
                <tr>
                    <td>
Phrase <xsl:value-of select="$numPhrase"/></td>
                </tr>


                <!-- pour tous les tokens de la phrase, on génère un ligne (tr) -->
                <xsl:for-each select="taggertoken">

                <!-- couleur du texte en fonction des marques de nombre de l'attribut pos -->
                <xsl:variable name="color">
                    <xsl:choose>
                        <xsl:when test="contains(@pos, ':sg')">red</xsl:when>
                        <xsl:when test="contains(@pos, ':pl')">green</xsl:when>
                        <xsl:otherwise>black</xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>

                <tr>
                    <td>
<xsl:value-of select="$numPhrase"/>.<xsl:value-of select="position ()"/></td>
                    <td>
                        <span style='color:
{$color}'>
                            <xsl:value-of select="@wordform"/>

                            <!-- on fait clignoter si le lemme est de la forme lemme1 | lemme2 -->
                            <xsl:if test="contains (@lemma, '|')">
                                <blink> (<xsl:value-of select="@lemma"/>) </blink>
                            </xsl:if>
                        </span>
                    </td>
                    <td>
<xsl:value-of select="@pos"/></td>
                 </tr>

                </xsl:for-each>
            </table>
            <br/>

        </xsl:for-each>

        </body>
    </html>

</xsl:template>

</xsl:stylesheet>
   

Précédent... ] Sommaire... ] Suivant... ]