2013-03-06

Perfidie du moteur XSL et déstructuration avec apply-templates

Un effet “amusant” découvert il y a peu et qui m’a couté quelques heures de recherche et de tests (avec un cache pour augmenter le “plaisir”) :

Considérons la transformation XSL suivante :

...

<div class="Items">
    <div class="Level0">
        <xsl:apply-templates select="..."/>
    </div>
    <div class="Level1">
        <xsl:apply-templates select="..."/>
    </div>
</div>

...

Lorsque les sélections contiennent toutes des éléments dans le flux d’entrée, tout se passe bien mais si la source du premier sélecteur (Level0) ne rencontre aucun candidat : patatras ! Le sous-flux retourné ressemble à :

<div class="Items">
    <div class="Level0">
        <div class="Level1">
            Des éléments...
        </div>
    </div>
</div>

La balise fermant le div “Level0” n’est injectée dans le flux de sortie qu’à la fin de celui-ci, causant éventuellement un décalage visuel sur un affichage HTML…

Pour revenir à une situation cohérente, il faut ajouter la directive précisant la méthode sortie en tête de flux XSL :

<xsl:stylesheet version="1.0" ...>
    <xsl:output method="html"/>
    ...

Et tout rentre dans l’ordre :

<div class="Items">
    <div class="Level0">
    </div>
    <div class="Level1">
        Des éléments...
    </div>
</div>

Si l’un d’entre vous a un début d’explication, je prends !

Mots clés Technorati : ,,,

Aucun commentaire: