1. #1
    Membre à l'essai Avatar de jean-c
    Homme Profil pro
    Développeur, documentaliste, gestionnaire d'information
    Inscrit en
    décembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur, documentaliste, gestionnaire d'information

    Informations forums :
    Inscription : décembre 2014
    Messages : 21
    Points : 12
    Points
    12

    Par défaut Apache FOP génération selon des critères dynamiques

    Bonsoir à tous,

    J'utilise Apache FOP 2.1 et j'ai réussi à produire un PDF à l'aide d'un XML et d'un fichier XSL utilisant FO. Jusque là, tout va bien. Mais ce que je voudrais, c'est faire en sorte de pouvoir donner en paramètres à XSLT aussi la police à utiliser et la taille de celle-ci.

    Je fais comme ceci :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:param name="monParam1 />"

    Ce paramètre reçoit ses informations de la commande envoyée à FOP que mon code PHP génère après avoir lui-même reçu ses informations de mon formulaire.
    Une fois les infos livrées à XSLT, je rappelle mes variable aux bons endroits comme ceci :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <fo:block font-size="$monParam1">
     <!--Mes instructions. -->
    </fo:block>

    Ainsi, je pourrais générer mon document PDF comme je le souhaite, mais Apache FOP me renvoie une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    GRAVE: Invalid property value encountered in font-size="$taillePolice": org.apache.fop.fo.expr.PropertyException: illegal character; property:'font-size' (No context info available)
    org.apache.fop.fo.expr.PropertyException: illegal character; property:'font-size'
    C'est le signe $ de la variable dans un attribut de XSLT qui gêne ? Ou bien un ; mal placé ? Je vais revoir ça mais si quelqu'un a une idée...

    Merci par avance.

  2. #2
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 071
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 071
    Points : 1 853
    Points
    1 853

    Par défaut

    Ce paramètre reçoit ses informations de la commande envoyée à FOP que mon code PHP génère après avoir lui-même reçu ses informations de mon formulaire.
    Pas tout à fait compris mais ce n'est pas grave: ce que je peux dire c'est d'une manière générale comment ça peut fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <fo:block font-size="$monParam1">
     <!--Mes instructions. -->
    </fo:block>
    Si ceci apparaît dans le document xsl-fo intermédiaire ou pas, il ne serait pas réussi et une erreur se résulte. Ce bloque de code devrait s'écrire dedans le document xslt, comme par exemple dedans un template xsl:template, pour avoir une chance de réussir à faire fonctionner. Toujours dans ce sens-là, le xsl:param :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:param name="monParam1 />"
    (le typo doit être corrigé, bien entendu) doit être apparu dans le document xslt comme un élément enfant direct de la racine xsl:stylesheet pour que la valeur du paramètre monParam1 puisse être dynamiquement assignée au temps d'éxecution. Voilà !

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 202
    Points : 18 959
    Points
    18 959

    Par défaut

    Enfin bon, en supposant que tout le reste soit correct, je rappelle que les préfixes fo: et xsl: ne sont pas pareils. (Par exemple il y en a un qui fait deux lettres et l'autre trois.)

    S'il est vrai que la plupart des balises XSLT savent interpréter les variables XSLT (parce que c'est leur travail), ce n'est pas le cas des balises FO. Leur travail c'est de mettre en forme un document. Il n'y a pas de variable en FO.

    Par conséquent quand tu écris <fo:block font-size="$monParam1"> tu demandes une fonte dont la taille est un nombre qui s'écrit $monParam1. Et moi je n'écris aucun nombre comme ça. Je les écris 16 ou 3005 ou 28, mais pas avec un $ ni avec des lettres.

    Si tu veux que XSLT prenne la main et interprète les paramètres des autres balises, il faut les mettre entre accolades { et }.

    Donc si tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <fo:block font-size="{$monParam1}">
    et que la variable XSLT monParam1 est réglée à 18, ça sera transformé en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <fo:block font-size="18">
    Et 18, ça c'est un nombre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre à l'essai Avatar de jean-c
    Homme Profil pro
    Développeur, documentaliste, gestionnaire d'information
    Inscrit en
    décembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur, documentaliste, gestionnaire d'information

    Informations forums :
    Inscription : décembre 2014
    Messages : 21
    Points : 12
    Points
    12

    Par défaut

    Ok Tsuji,

    Le paramètre se trouve bien dans mon XSLT, c'est FOP qui le lui envoie via une commande, tout comme d'autres informations.

    Donc il faudrait que je crée un template XSLT contenant mon paramètre puis que je l'appelle pour que l'interprétation se fasse correctement ?

    Concrètement, voici comme le document est fait (sans toutes les instructions préalables) :

    Code xml : 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
    28
    29
    30
    31
    32
    33
     
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Prologues XSLT + namespaces -->
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
     
    <!--Mes paramètres.-->
    <xsl:param name="maTaillePerso" />
    <xsl:param name="maPolicePerso" />
     
    <xsl:output method="html" indent="yes" encoding="UTF-8"/>
     
    <!--Template global -->
    <xsl:template match="/">
     
    <!--Elément racine-->
    <fo:root>
     
    <!--Ici, normalement, les paramètres du <fo:layout-master-set> qui permet de définir les "régions d'une page".-->
     
    <fo:page-sequence master-reference="maPage">
    <fo:flow flow-name="monFlow">
     
    <!--Le bloc pour lequel je veux qu'un paramètre s'applique.-->
    <fo:block font-size="$maTaillePerso" font-family="$maPolicePerso">
      <!--Mes instructions-->
    </fo:block>
     
    </fo:flow>
    </fo:page-sequence>
    </fo:root>
    </xsl:template>
    </xsl:stylesheet>

    Il faudrait que mon <fo:block></fo:block> soit dans un template que j'appellerais en lieu et place de ce que j'avais écrit au départ avec <xsl:apply-template select="monTemplate"></xsl:apply-template> ? Comme ça ?

    Code xml : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Prologues XSLT + namespaces -->
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
     
    <!--Mes paramètres.-->
    <xsl:param name="maTaillePerso" />
    <xsl:param name="maPolicePerso" />
     
    <xsl:output method="html" indent="yes" encoding="UTF-8"/>
     
    <xsl:template name="monTemplate">
    <!--Le bloc pour lequel je veux qu'un paramètre s'applique.-->
    <fo:block font-size="$maTaillePerso" font-family="$maPolicePerso">
      <!--Mes instructions-->
    </fo:block>
    </xsl:template>
     
    <!--Template global -->
    <xsl:template match="/">
     
    <!--Elément racine-->
    <fo:root>
     
    <!--Ici, normalement, les paramètres du <fo:layout-master-set> qui permet de définir les "régions d'une page".-->
     
    <fo:page-sequence master-reference="maPage">
    <fo:flow flow-name="monFlow">
     
    <!--Appel du template.-->
    <xsl:apply-template select="monTemplate" />
     
    </fo:flow>
    </fo:page-sequence>
    </fo:root>
    </xsl:template>
    </xsl:stylesheet>

    C'est censé marcher comme ça ?

    Merci.

  5. #5
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 071
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 071
    Points : 1 853
    Points
    1 853

    Par défaut

    Il faudrait que mon <fo:block></fo:block> soit dans un template que j'appellerais en lieu et place de ce que j'avais écrit au départ avec <xsl:apply-template select="monTemplate"></xsl:apply-template> ? Comme ça ?
    Non, ce n'est pas ce que je veux dire: la première xslt est bon à aller. Tout fois, il y a quelques détails à corriger et il devrait commencer à marcher. Désolé si ce n'est pas très clair.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:output method="html" indent="yes" encoding="UTF-8"/>
    La méthode n'est pas html. Il vaut mieux soit supprimer la ligne, soit laisser la méthode xml (par défaut)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
    L'attribut indent n'est pas important ici parce que le 'output' devient un document xsl-fo intermédiaire consommé par le moteur correspondant (fo)...

    Et puis le résolution des paramètres doit être fait via un outil qui s'appelle 'attribut valeur templat' (avt) comme ça:
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!--
    <fo:block font-size="$maTaillePerso" font-family="$maPolicePerso">
    -->
    <fo:block font-size="{$maTaillePerso}" font-family="{$maPolicePerso}">
    ou bien plus laboreusement comme ça:
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <fo:block>
        <xsl:attribute name="font-size"><xsl:value-of select="$maTaillePerso" /></xsl:attribute>
        <xsl:attribute name="font-family"><xsl:value-of select="$maPolicePerso" /></xsl:attribute>
    Comme la syntaxe avec avt semble plus simple, on s'en serve assez convenablement. Dans le cas-ci, elles sont équivalentes. Mais, dans certain cas, l'avt est la seule écriture possible --- encore, pas dans les cas-ci.

  6. #6
    Membre à l'essai Avatar de jean-c
    Homme Profil pro
    Développeur, documentaliste, gestionnaire d'information
    Inscrit en
    décembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur, documentaliste, gestionnaire d'information

    Informations forums :
    Inscription : décembre 2014
    Messages : 21
    Points : 12
    Points
    12

    Par défaut Merci !

    Mesdames, Mesdemoiselles, Messieurs,

    Ca fonctionne, je vous remercie, j'avais déjà dans l'idée que cette syntaxe fonctionnait :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <fo:block>
        <xsl:attribute name="font-size"><xsl:value-of select="$maTaillePerso" /></xsl:attribute>
        <xsl:attribute name="font-family"><xsl:value-of select="$maPolicePerso" /></xsl:attribute>

    Mais elle est lourde je trouve. J'ai donc utilisé celle que Tsuji appelle AVT (Attribut Valeur Template) :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <fo:block font-size="{$maTaillePerso}" font-family="{$maPolicePerso}">

    Moralité : Pour utiliser des paramètres XSLT dans du FO, ne pas oublier de les placer entre accolades !

    Je peux maintenant créer des PDF avec une police et une taille de police personalisée selon une valeur préalablement sélectionnée dans un formulaire !

    Merci à tous, je passe ça en résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Comment sélectionner un item de listview selon des critères
    Par beufreecasse dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/10/2006, 20h34
  2. Requetes selon des critères
    Par Z[ee]k dans le forum Access
    Réponses: 6
    Dernier message: 05/06/2006, 14h06
  3. tableau descriptif de SQL server selon des critères techniq
    Par h.sofia dans le forum MS SQL-Server
    Réponses: 2
    Dernier message: 16/02/2006, 16h25
  4. Supprimer des sous-dossiers selon des critères
    Par Dertron dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 18/01/2006, 14h33
  5. lister des fichiers selon des critères
    Par Corben dans le forum Scripts
    Réponses: 12
    Dernier message: 18/10/2005, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo