Bonjour à tous !!
Je me pose des questions quant à la faisabilité de la chose, mais voilà le problème...
Je parse des fichiers xsl-fo. Ces derniers contiennent bcp d'attributs de mise en forme dans les balises, genre font-size, font-family, padding-left, padding-top, etc...
J'ai plusieurs types de balises : fo:block, fo:block-container, fo:inline, fo:table, fo:table-row, fo:table-cell (et bien d'autres) mais celles que je viens d'énumérer sont les plus susceptibles de contenir ces attributs de formatage.
Dans mon document xsl actuel, j'ai des templates pour chacune de ces balises, et chaque template prend en charge un certain nombre de tests pour récupérer ces variables de formatage, exemple :
Vous pourrez remarquer qu'il y a une redondance sur les variables des 2 templates : font-family, font-size et font-weight sont dans les 2 templates, et possède un code identique...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 <xsl:template match="fo:inline"> <xsl:variable name="size"> <xsl:if test="./@font-size != ''">font-size:<xsl:value-of select="number( substring-before( ./@font-size, 'px' ) ) + $incrementFont" />px;</xsl:if> </xsl:variable> <xsl:variable name="family"> <xsl:if test="./@font-family != ''">font-family:<xsl:value-of select="./@font-family" />;</xsl:if> </xsl:variable> <xsl:variable name="weight"> <xsl:if test="./@font-weight != ''">font-weight:<xsl:value-of select="./@font-weight" />;</xsl:if> </xsl:variable> <span style="{$size}{$family}{$weight}"> <xsl:apply-templates /> </span> </xsl:template> <xsl:template match="fo:table-row"> <xsl:variable name="weight"><xsl:if test="./@font-weight != ''">font-weight:<xsl:value-of select="./@font-weight" />;</xsl:if></xsl:variable> <xsl:variable name="size"> <xsl:if test="./@font-size != ''">font-size:<xsl:value-of select="number( substring-before( ./@font-size, 'px' ) ) + $incrementFont" />px;</xsl:if> </xsl:variable> <xsl:variable name="family"><xsl:if test="./@font-family != ''">font-family:<xsl:value-of select="./@font-family" />;</xsl:if></xsl:variable> <tr style="{$weight}{$size}{$family}"> <xsl:apply-templates /> </tr> </xsl:template>
La question que je me pose, c'est : est-ce qu'il est possible d'éviter ces redondances... J'imagine que oui, et je penche pour 2 hypothèses, mais je ne vois pas très bien comment les mettre en place (par manque de connaissance en XSL).
La première, ça serait de pouvoir déclarer le code de la variable en dehors de tout template, et d'y faire appel dans les templates nécessitant le test... Mais ça j'y crois assez peu, d'après ce que j'ai pu comprendre...
La seconde, ça serait de créer un "gros" template qui teste toute les variables de formatage possible et imaginable, et que j'appelle avec un "call-template" en lui passant le type de balise testé...
Exemple :
- call-template with-param type=fo:block,
- call-template with-param type=fo-block-container,
- call-template with-param type=fo:table
Dans mon template, je teste d'abord toutes les variables, puis ensuite, selon le paramètre "type", je crée un div (fo:block, fo:block-container), un span (fo:inline), une table (fo:table), une ligne (fo:table-row), etc...
J'imagine que c'est la solution la plus envisageable, mais ce que je n'arrive pas à comprendre, c'est comment faire...
A la base, je fais appel à
ce qui va permettre de parcourir récursivement toutes les balises sans se préoccuper de leur "type". Maintenant je me demande comment faire pour que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <xsl:template match="fo:root"> <xsl:apply-templates /> </xsl:template>
- si pour une balise donnée un template spécifique existe (exemple : fo:basic-link nécessite un traitement particulier) il utilise le template spécifique
- si pour une balise donnée il n'existe pas de template spécifique il utilise le template spécial qui prend en charge toutes les variables nécessaire et selon le paramètre "type" il va me sortir un output particulier (table, div, span, etc...)
Je suis à l'écoute de vos suggestions, d'avance merci :-)
Partager