[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...:calim2:
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...:cfou:
Bref, j'ai l'impression qu'il fait un peu ce qu'il veut et moi je suis perdu :aie:
Voici ce que j'ai fais pour le moment :
La feuille xsl
Code:
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:
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 :mur:
+++
Ju