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 :

[XSL~FO]tableau de taille dynamique


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut [XSL~FO]tableau de taille dynamique
    Bonjour à tous !

    Je voudrais exporter les JTables de mon appli Java en PDF avec FOP. Afin d'éviter d'avoir à faire une feuille de style pour chaque table, j'aimerai n'en avoir qu'une qui adapte le nombre de lignes/colonnes en fonction du flux XML.

    Auriez-vous une petite idée ? Pour les lignes y a pas de problème, mais pour les colonnes, je bloque un peu...
    En fait le problème est à la génération :
    Si je n'ai que 3 colonnes dans mon XML --> j'ai 6 colonnes dans mon PDF (avec comme header : D-E-F...)
    A l'inverse, si j'ai 7 colonnes, je n'ai alors que 6 headers dans le pdf, quant aux valeurs, elles sont ajoutées correctement...
    Bref, j'ai l'impression qu'il fait un peu ce qu'il veut et moi je suis perdu

    Voici ce que j'ai fais pour le moment :
    La feuille xsl
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    -->
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:fo="http://www.w3.org/1999/XSL/Format">
     
     <xsl:template match="/">
     
     <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
     
       <fo:layout-master-set>
         <fo:simple-page-master master-name="simple"
                       page-height="29.7cm" 
                       page-width="21cm"
                       margin-top="1cm" 
                       margin-bottom="2cm" 
                       margin-left="2.5cm" 
                       margin-right="2.5cm">
           <fo:region-body margin-top="3cm"/>
           <fo:region-before extent="3cm"/>
           <fo:region-after extent="1.5cm"/>
         </fo:simple-page-master>
       </fo:layout-master-set>
     
     
       <fo:page-sequence master-reference="simple">
       	<fo:flow flow-name="xsl-region-body">
       	       <xsl:apply-templates select="data"/>
       	</fo:flow>
       </fo:page-sequence>
    
      </fo:root> 
     </xsl:template>
     
     <!-- Handling data -->
     <xsl:template match="data">
           <fo:block>
           	<xsl:apply-templates select="name"/>
           </fo:block>
           <fo:block font-size="14pt" 
                 font-family="sans-serif" 
                 space-after.optimum="15pt"
                 background-color="silver"
                 color="black"
                 text-indent="5mm" 
                 space-before="10mm"
                 padding-top="3pt"
                 border-top-color="orange"
              border-top-style="solid"
              border-top-width="medium">
    			Records
    		</fo:block>
    		 <!-- Creating table -->
    		<fo:table table-layout="fixed" space-before.optimum="10pt">
    			<!-- Computes the column number count(column-name)-->
    		        <xsl:variable name="cols" select="count(./column-name)"/>
    		        <xsl:variable name="ratio" select="16 div ($cols)"/>
    		        <xsl:variable name="k" select="concat(format-number($ratio, '##.##'), 'cm')"/>
                            <!-- for each columns, get the col. size and set the position -->
    			<xsl:for-each select="./*">
    			  <fo:table-column>
    			  		<xsl:attribute name="column-width">
    			  			<xsl:value-of select="$k"/>
    			  		</xsl:attribute>
    					<xsl:attribute name="column-number">
    						<xsl:value-of select="position()"/>
    					</xsl:attribute>
    				</fo:table-column>
    			</xsl:for-each>
    			<!-- Fill the column headers -->
    			<fo:table-body>	
    				<fo:table-row>
    				  <xsl:for-each select="column-name">
    				      <fo:table-cell border="0.5pt solid black" background-color="silver">
                            	                  <fo:block color="white" font-size="10pt" line-height="11pt" text-align="center" space-before.optimum="5pt">
                                	                           <xsl:value-of select="text()"/>
                            	                  </fo:block> 
                   	             </fo:table-cell>
                 		               </xsl:for-each>
     				</fo:table-row>
    		
     			<!-- Fill the table -->
    				<xsl:apply-templates select="row"/>
    			</fo:table-body> 
    		</fo:table>
     </xsl:template>
     
     <xsl:template match="name">       
           <fo:block font-size="18pt" 
                 font-family="sans-serif" 
                 line-height="24pt"
                 space-after.optimum="15pt"
                 background-color="silver"
                 color="black"
                 text-align="center"
                 padding-top="3pt"
                 border-top-color="orange"
              border-top-style="solid"
              border-top-width="medium">
             <xsl:value-of select="."/>
           </fo:block> 
     </xsl:template>
     <!-- handling rows-->
     <xsl:template match="row">
           			<fo:table-row>
     				<xsl:for-each select="./*">
                    <fo:table-cell border="0.5pt solid black">
                            <fo:block color="black" font-size="8pt" line-height="11pt" text-align="center" space-before.optimum="5pt">
                              <xsl:if test="."><xsl:value-of select="."/></xsl:if>
                            </fo:block> 
                    </fo:table-cell>
                 	</xsl:for-each>
                 </fo:table-row>							
     </xsl:template>             
     </xsl:stylesheet>
    La fichier xml :
    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
    28
    29
    30
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE data SYSTEM "file.dtd">
    <data>
    <name>Exportation</name>
    <column-name>one</column-name>
    	<row number = "0">
    		<value column-name="one">coucou</value>		<value column-name="two">2</value>		<value column-name="three">3</value>		<value column-name="four">4</value>
    	</row>
    <column-name>two</column-name>
    	<row number = "1">
    		<value column-name="one">1</value>		<value column-name="two">je</value>		<value column-name="three">3</value>		<value column-name="four">4</value>
    	</row>
    <column-name>three</column-name>
    	<row number = "2">
    		<value column-name="one">1</value>		<value column-name="two">2</value>		<value column-name="three">m'appelle</value>		<value column-name="four">4</value>
    	</row>
    <column-name>four</column-name>
    	<row number = "3">
    		<value column-name="one">1</value>		<value column-name="two">2</value>		<value column-name="three">3</value>		<value column-name="four">brian</value>
    	</row>
    <column-name>E</column-name>
    	<row number = "4">
    		<value column-name="one">le</value>		<value column-name="two">bo</value>		<value column-name="three">gosse</value>		<value column-name="four">4</value>
    	</row>
    <column-name>F</column-name>
    	<row number = "5">
    		<value column-name="one">first</value>		<value column-name="two">of</value>		<value column-name="three">all</value>		<value column-name="four">welcome</value>
    	</row>
    </data>
    Merci aux courageux qui seront arrivés jusqu'ici
    +++
    Ju

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    je n'ai pas bcp de tems pour tester, mais deux conseil :

    - remplace tes "for-each" par un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsltemplate match="column-name">
    - ta structure est assez figé (au niveau nom de tags), donc remlace les

    par les vrais intitulés de ton xml....comme ça déja tu peux avoir plus de visibilité ....

  3. #3
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    Merci !
    Toutefois, le fait de remplacer mon for-each par un template supprime mes headers... Quant au ./*, je n'ai pas trouvé d'autre solution "plus propre" pour sélectionner tous les noeuds fils...

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    il fait exactement ce que tu lui demandes de faire...

    Je ne saisis pas très bien la structure de ton XML... Notamment je ne comprends pas pourquoi le nombre d'éléments <column-name> ne correspond pas au nombre d'éléments <value> dans chaque ligne. Il faudrait que tu précises quelle règle doit être suivie pour définir le nombre de colonnes du tableau.

  5. #5
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    Euh... Mon XML contient les informations à stocker dans le tableau.
    <column-name>one</column-name> par exemple contient le nom d'un header

    Pour les lignes, j'ai l'index en attribut et chaque cellule représentées par la balise "value" qui fait référence à la colonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <row number = "0">
    		<value column-name="one">coucou</value>		<value column-name="two">2</value>		<value column-name="three">3</value>		<value column-name="four">4</value>		<value column-name="four">-------</value>		<value column-name="four">-------</value>
    </row>
    Je voulais ensuite ajuster la largeur de mon tableau en fonction du nombre de colonnes (8 maxi)...
    Tout ca dans le but de faire un truc générique, à l'origine

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    On a du mal à se comprendre...

    Dans ton XML tu as 6 headers, et 4 valeurs par ligne. Que fait-on des headers qui ne trouvent pas de correspondances parmi les valeurs ?

  7. #7
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    J'y avais pas fais attention
    En fait, c'est mon programme Java qui transforme ma JTable en XML... Il rajoute des noms de colonnes... ce qui fait que je me retrouve avec un fichier XML incorrect
    Je vais déjà voir ca...

  8. #8
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    Oulalala !!!
    Je suis confus
    Vraiment désolé ! Je pensais que ca venait du XSL (qui fonctionne à merveille en fait) donc je ne me suis même pas penché sur mon XML...
    Merci beaucoup pour m'avoir ouvert les yeux

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par sozie9372
    Merci beaucoup pour m'avoir ouvert les yeux
    De rien.

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    moi aussi je dois plus ouvrir les yeux....j'ai regardé plus ton xsl.....et effectivement ton xml était un peu bourré

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

Discussions similaires

  1. Matrice de Matrice dans un tableau de taille dynamique
    Par J_help dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 14/04/2010, 22h03
  2. tableau de taille dynamique
    Par TaymouWan dans le forum C#
    Réponses: 12
    Dernier message: 17/03/2009, 18h52
  3. [xsl-fo]Problème de données dynamiques dans un tableau.
    Par Little_flower dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 21/05/2007, 10h35
  4. Réponses: 24
    Dernier message: 26/04/2007, 15h20
  5. [c++] Tableau avec taille initiale dynamique
    Par mister3957 dans le forum C++
    Réponses: 15
    Dernier message: 22/11/2005, 11h33

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