element et attribute


Nous avons vu dès le premier exemple que nous pouvions générer des éléments XML en sortie. Il suffit pour cela d'écrire les balises XML et leurs valeurs dans la feuille de style. Cependant, dans cet exemple, les balises à produire étaient toujours les mêmes : leur nom était constant et connu à l'avance (ecrits "en dur" dans la feuille de style). On peut avoir à produire des balises dont le nom ou les attributs sont calculés lors de la transformation.

Syntaxe
<xsl:element name="nom_element">
    <xsl:attribute name="nom_attribut1">valeur attribut1</xsl:attribute>
    <xsl:attribute name="nom_attribut2">valeur attribut2</xsl:attribute>
    ...

    valeur element...
</xsl:element>
 
Exemple
En reprenant toujours le même exemple en entrée :
<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>

Supposons que nous voulions convertir ce document pour l'utiliser avec un outil qui s'attend à recevoir le format suivant :
<doc>
    <taggersent>
        <PRO gram="sg">Il</PRO>
        <VER gram="femi:sg">était</VER>
        <DET gram="femi:sg">une</DET>
        <NOM>fois</NOM>
        <PUN>,</PUN>
        <DET gram="masc:pl">les</DET>
        <NOM gram="masc:pl">voleurs</NOM>
        <VER gram="pl">étaient</VER>
        <PRP>dans</PRP>
        <DET gram="femi:sg">la</DET>
        <NOM gram="femi:sg">forêt</NOM>
        <PUN>.</PUN>
    </taggersent>
    <taggersent>
        <PRO>Ils</PRO>
        <VER gram="pl">étaient</VER>
        <PRO>tous</PRO>
        <VER gram="pper:masc:pl">assis</VER>
        <ADV>autour</ADV>
        <PRP gram="DET:masc:sg">du</PRP>
        <NOM gram="masc:sg">feu</NOM>
        <PUN>.</PUN>
    </taggersent>
</doc>


XSL
<xsl:template match="*">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="taggertoken">
    <xsl:variable name="elementName">
        <xsl:choose>
            <xsl:when test="contains(@pos, ':')">
                <xsl:value-of select="substring-before(@pos, ':')"/> 
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="@pos"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

    <xsl:element name="{$elementName}">
        <xsl:if test="contains(current()/@pos, ':')">
            <xsl:attribute name="gram">
                <xsl:value-of select="substring-after(@pos, ':')"/>
            </xsl:attribute>
        </xsl:if>

        <xsl:value-of select="@wordform"/>
    </xsl:element>
</xsl:template>
   Le nom des éléments générés ne peut ici être écrit à l'avance. Il dépend des attributs des éléments en cours de transformation. C'est pour cette raison que nous définissons la variable elementName et que nous l'affectons au nom de l'élément généré. De même pour la valeur de l'attribut gram.

 

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