IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

Mise en page ligne par ligne sur 2 colonnes. [XSL-FO]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Débutant en XSLT
    Inscrit en
    Avril 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Débutant en XSLT

    Informations forums :
    Inscription : Avril 2011
    Messages : 54
    Points : 32
    Points
    32
    Par défaut Mise en page ligne par ligne sur 2 colonnes.
    Bonjour tout le monde,

    Débutant aussi avec XSL-FO je rencontre un problème de mise en page...

    J'aimerais mettre en page des informations de cette manière :
    [Data1][Data2]
    [Data3][Data4]
    [Data5][Data6]
    [Data7][Data8]

    Où chaque [DataX] correspond à un block formaté contenant les données d'un élément XML. Le chiffre vous donne l'ordre de remplissage (de gauche à droite).

    A l'heure d'aujourd'hui, je sais définir 2 colonnes et remplir mes blocks colonne par colonne. Or ce n'est pas ce que je veux.... moi c'est ligne par ligne mis en page sur 2 colonnes !



    En espérant être clair,
    Merci de tout tuyau pour me débloquer

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Débutant en XSLT
    Inscrit en
    Avril 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Débutant en XSLT

    Informations forums :
    Inscription : Avril 2011
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    J'ai oublié de préciser,

    Etant donnée que cette mise en page sera générée à partir d'un <xsl:template match="..">, je peux difficilement choisir l'option du <table> pour cette mise en page...

    Sauf si vous avez une idée pratique !

  3. #3
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:variable name="tag" value="local-name()"/>
    <xsl:if test="position() mod 2 = 0">
      <tr>
        <td><xsl:value-of select="."/></td>
        <td><xsl:value-of select="following-sibling::$tag[1]"/></td>
      </tr>
    </xsl:if>

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Débutant en XSLT
    Inscrit en
    Avril 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Débutant en XSLT

    Informations forums :
    Inscription : Avril 2011
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    Super, je vais m'en inspirer pour XSL-FO.

    Je test cela demain matin et je reviens pour confirmer que tout est ok

    Merci Loceka !

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Débutant en XSLT
    Inscrit en
    Avril 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Débutant en XSLT

    Informations forums :
    Inscription : Avril 2011
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    L'indication m'a bien aidée . Je mets mon code pour infos (pour les suivants dans mon cas)

    Initialement, je crée un tableau dans lequel j'applique ma template. Ici, je cherche à mettre en page l'élément ENTRY.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		<fo:table width="100%">
    			<fo:table-column column-width="proportional-column-width(1)"/>
    			<fo:table-column column-width="proportional-column-width(1)"/>
    			<fo:table-body>
    				<xsl:apply-templates select="ENTRY"/>
    			</fo:table-body>
    		</fo:table>
    Puis dans la template j'ai la condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	<xsl:template match="ENTRY">
    					<xsl:if test="position() mod 2 = 0">
    						<fo:table-row>
    							<fo:table-cell>
    								<xsl:apply-templates select="." mode="insertion"/>
    							</fo:table-cell>
    							<fo:table-cell>
    								<xsl:apply-templates select="following-sibling::ENTRY[1]" mode="insertion"/>
    							</fo:table-cell>
    						</fo:table-row>
    					</xsl:if>
    	</xsl:template>
    Pour alléger mon code (et éviter le doublon), j'ai créé une autre template qui contient la mise en forme des éléments à mettre en page de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	<xsl:template match="ENTRY" mode="insertion">
    Ici faire la mise en forme à coup de <fo:block> voire même d'un autre <fo:table> ! :)
    	</xsl:template>

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Débutant en XSLT
    Inscrit en
    Avril 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Débutant en XSLT

    Informations forums :
    Inscription : Avril 2011
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    ERRATUM !

    Mon code plus haut est faux... Je me suis laissé avoir dans la masse mais en y regardant de plus près les résultats n'étaient pas bons.

    Il ne faut pas faire position() mod 2 = 0 mais =1 dans mon cas, car je veux sélectionner le premier élément impaire de chaque groupe de 2.

    Autre chose, le pourquoi je me suis fait duper... la fonction Position() peut être trompeuse car elle calcul aussi les noeuds d'espace vide (white-space).

    Il faut donc utiliser la balise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:strip-space elements="element1 element2 element3" />
    Après <xsl:stylesheet> et après <xsl:import> (si vous l'utilisez).

    Où element1, element2... correspondent aux éléments pour lesquels vous voulez que le processeur XLS ne prenne pas en compte les white-space.

    Ainsi vous aurez la vraie valeur des noeuds !



    A noter que ce code est valable sur des colonnes plus longues. Exemple si je veux aligner 5 éléments par ligne, il faut que j'utilise :
    Ce qui me permettra de selectionner un élément tous les 5.

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

Discussions similaires

  1. [XL-2010] Mise en forme conditionnelle par ligne
    Par sbricout dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/02/2011, 17h51
  2. [Toutes versions] [débutant] condition sur une case par ligne, et action sur chaque ligne
    Par touille dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/06/2010, 17h17
  3. Réponses: 4
    Dernier message: 11/06/2009, 09h57
  4. Calcul ligne par ligne sur le résultat d'une requête
    Par CanardJM dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/04/2008, 13h06
  5. Nombre de ligne par défaut sur un Picklist
    Par ranandria dans le forum Delphi
    Réponses: 1
    Dernier message: 02/04/2007, 13h50

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