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] Mettre en forme du Xml (pas si simple !)


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 84
    Par défaut [xsl:fo] Mettre en forme du Xml (pas si simple !)
    Bonjour à tous !

    Je souhaiterai mettre en forme un Xml avec du XSL:FO, rien de plus simple me dirait vous vu que c'est exactement son but !

    Mais la où ca se complique c'est que j'aimerai que le xml soit mis en forme dans un tableau...

    En fait, j'ai mon xml qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <node value="1">
    			<node value="2"/>
    			<node value="3">
    						<node value="4"/>
    						<node value="5"/>
    			</node>
    			<node value="6"/>
    			<node value="7"/>
    </node>
    <node value="8"/>
    <node value="9"/>
    et j'aimerai qu'il soit présenté dans un tableau qui ait cette forme :

    _______________________________________________
    |_______________|_____2_________|_______________|
    |______1________|_______________|______4________|
    |_______________|_____3_________|______5________|
    |_______________|_____6_________|_______________|
    |_______________|_____7_________|_______________|
    |_____8_________|_______________|_______________|
    |_____9_________|_______________|_______________|

    En gros, le premier niveau des noeuds serait dans la premiere colonne, le deuxième niveau dans le deuxième etc...

    Je me permet de demander de l'aide parceque je pense que ce type de mise en forme de XML doit être assez courant mais je n'ai rien pu trouver dans google. Donc toute aide serait la bienvenue.

    Merci d'avance

  2. #2
    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,

    c'est plutôt coton... Il me semble que ça ferait d'ailleurs un défi valable.

    J'imagine que le nombre de colonnes est égal à la profondeur de l'arbre ?
    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

  3. #3
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    pasmal comme défi d ailleurs effectivement...
    oin peut utiliser les table html?

  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
    Bon alors comme y'avait rien à la télé ce soir, je me suis attaqué à ton petit problème...

    En prenant comme base ce fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
    <test>
    	<node value="1"> 
    			 <node value="2"/> 
    			 <node value="3"> 
    					  <node value="4"/>
                          <node value="5"/> 
    			 </node> 
    			 <node value="6"/> 
    			 <node value="7"/> 
    	</node> 
    	<node value="8"/> 
    	<node value="9"/> 
    </test>
    J'ai trouvé cela :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    	<xsl:output method="html"/>
     
    	<xsl:variable name="nb-colonnes">
    		<xsl:call-template name="profondeur-arbre">
    			<xsl:with-param name="feuille" select="//node[not(node)][1]"/>
    		</xsl:call-template>
    	</xsl:variable>
     
    	<xsl:template match="/test">
    		<html>
    			<head>
    				<title>Tableau</title>
    			</head>
    			<body>
    				<table border="1">
    					<xsl:for-each select="descendant::node[not(parent::node) or count(.|parent::node/node[1]) = 2]">
    						<tr>
    							<xsl:apply-templates select="."/>
    						</tr>
    					</xsl:for-each>
    				</table>
    			</body>
    		</html>
    	</xsl:template>
     
    	<xsl:template match="node">
    		<td>
    			<xsl:variable name="nb-lignes" select="count(descendant::node[not(node)])"/>
    			<xsl:if test="$nb-lignes &gt; 1">
    				<xsl:attribute name="rowspan">
    					<xsl:value-of select="$nb-lignes"/>
    				</xsl:attribute>
    			</xsl:if>
    			<xsl:value-of select="@value"/>
    		</td>
    		<xsl:choose>
    			<xsl:when test="node[1]">
    				<xsl:apply-templates select="node[1]"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:call-template name="cellules-vides">
    					<xsl:with-param name="nb-cellules" select="$nb-colonnes - count(ancestor::node) - 1"/>
    				</xsl:call-template>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
     
    	<xsl:template name="profondeur-arbre">
    		<xsl:param name="profondeur" select="1"/>
    		<xsl:param name="feuille"/>
    		<xsl:variable name="profondeur-feuille" select="count($feuille/ancestor::node) + 1"/>
    		<xsl:choose>
    			<xsl:when test="$feuille/following::node[not(node)]">
    				<xsl:call-template name="profondeur-arbre">
    					<xsl:with-param name="feuille" select="$feuille/following::node[not(node)][1]"/>
    					<xsl:with-param name="profondeur">
    						<xsl:choose>
    							<xsl:when test="$profondeur-feuille &gt; $profondeur">
    								<xsl:value-of select="$profondeur-feuille"/>
    							</xsl:when>
    							<xsl:otherwise>
    								<xsl:value-of select="$profondeur"/>
    							</xsl:otherwise>
    						</xsl:choose>
    					</xsl:with-param>
    				</xsl:call-template>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:value-of select="$profondeur"/>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
     
    	<xsl:template name="cellules-vides">
    		<xsl:param name="nb-cellules"/>
    		<xsl:if test="$nb-cellules &gt; 0">
    			<td><xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></td>
    			<xsl:call-template name="cellules-vides">
    				<xsl:with-param name="nb-cellules" select="$nb-cellules - 1"/>
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
     
    </xsl:stylesheet>
    La sortie est du HTML, mais tu ne devrais pas avoir de difficultés à l'adapter pour XSL-FO. Je te laisse digérer cela...
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 84
    Par défaut
    Ouh la la !

    Je ne m'attendais pas à autant d'aide ! C super cool ! Je vais essayer d'adapter mon code en xsl:fo et je le posterai !

    Merci encore !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 84
    Par défaut
    Voila je l'ai adapté en XSl:Fo :
    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
    <?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" xmlns:fox="http://xml.apache.org/fop/extensions">
     
    	<xsl:variable name="nb-colonnes">
    		<xsl:call-template name="profondeur-arbre">
    			<xsl:with-param name="feuille" select="//node[not(node)][1]"/>
    		</xsl:call-template>
    	</xsl:variable>
     
    	<xsl:template match="/test">
    		<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    			<!-- defines the layout master -->
    			<fo:layout-master-set>
    				<fo:simple-page-master master-name="first" page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
    					<fo:region-body/>
    					<fo:region-before extent="3cm"/>
    					<fo:region-after extent="1.5cm"/>
    				</fo:simple-page-master>
    			</fo:layout-master-set>
    			<!-- starts actual layout -->
    			<fo:page-sequence master-reference="first" language="en">
    				<fo:flow flow-name="xsl-region-body" font-family="Arial, Helvetica, sans-serif">
    				<fo:block>
    					<fo:table  table-layout="fixed">
     
    <!-- IL MANQUE JUSTE A AUTOMATISER LE NOMBRE DE COLONNES -->						
    						<fo:table-body>							
    							<xsl:for-each select="descendant::node[not(parent::node) or count(.|parent::node/node[1]) = 2]">
    								<fo:table-row>
    									<xsl:apply-templates select="."/>
    								</fo:table-row>
    							</xsl:for-each>					
    						</fo:table-body>
     
    					</fo:table>
    					</fo:block>
    				</fo:flow>
    			</fo:page-sequence>
    		</fo:root>
    	</xsl:template>
     
     
     
    	<xsl:template match="node">
    		<fo:table-cell border="1px solid black">
    			<xsl:variable name="nb-lignes" select="count(descendant::node[not(node)])"/>
    			<xsl:if test="$nb-lignes &gt; 1">
    				<xsl:attribute name="number-rows-spanned"><xsl:value-of select="$nb-lignes"/></xsl:attribute>
    			</xsl:if>
    			<fo:block>
    				<xsl:value-of select="@value"/>
    			</fo:block>
    		</fo:table-cell>
    		<xsl:choose>
    			<xsl:when test="node[1]">
    				<xsl:apply-templates select="node[1]"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:call-template name="cellules-vides">
    					<xsl:with-param name="nb-cellules" select="$nb-colonnes - count(ancestor::node) - 1"/>
    				</xsl:call-template>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
     
    	<xsl:template name="cellules-vides">
    		<xsl:param name="nb-cellules"/>
    		<xsl:if test="$nb-cellules &gt; 0">
    			<fo:table-cell border="1px solid black">
    				<fo:block/>
    			</fo:table-cell>
    			<xsl:call-template name="cellules-vides">
    				<xsl:with-param name="nb-cellules" select="$nb-cellules - 1"/>
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
     
    		<xsl:template name="profondeur-arbre">
    		<xsl:param name="profondeur" select="1"/>
    		<xsl:param name="feuille"/>
    		<xsl:variable name="profondeur-feuille" select="count($feuille/ancestor::node) + 1"/>
    		<xsl:choose>
    			<xsl:when test="$feuille/following::node[not(node)]">
    				<xsl:call-template name="profondeur-arbre">
    					<xsl:with-param name="feuille" select="$feuille/following::node[not(node)][1]"/>
    					<xsl:with-param name="profondeur">
    						<xsl:choose>
    							<xsl:when test="$profondeur-feuille &gt; $profondeur">
    								<xsl:value-of select="$profondeur-feuille"/>
    							</xsl:when>
    							<xsl:otherwise>
    								<xsl:value-of select="$profondeur"/>
    							</xsl:otherwise>
    						</xsl:choose>
    					</xsl:with-param>
    				</xsl:call-template>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:value-of select="$profondeur"/>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>
    Voila ! En esperant que cela va en aider beaucoup !

    A+

  7. #7
    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
    <!-- IL MANQUE JUSTE A AUTOMATISER LE NOMBRE DE COLONNES -->
    Ca, c'est pas bien difficile : on a dans $nb-colonnes le nombre total de colonnes du tableau, il suffit d'un petit template récursif pour déclarer les largeurs de colonnes.
    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

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 83
    Par défaut
    EDIT : trouvé

Discussions similaires

  1. [XSLT 1.0] Mettre en forme un schéma xsd avec une feuille de style xsl
    Par rinfray dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 24/04/2013, 09h04
  2. [XML] Inclusion par entité externe d'un morceau XML pas bien formé
    Par vieuxblasé dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 11/07/2011, 17h36
  3. Réponses: 5
    Dernier message: 23/10/2010, 14h34
  4. [xsl] Ajouter 1 élément à la page xml
    Par ametisse dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 10/03/2003, 12h15

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