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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    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 émérite
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    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 émérite Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    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 confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    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.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    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 confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    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 ?
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    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...

+ 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