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 :

[XSLT] Rassembler des données en colonnes suivant un identifiant


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
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Par défaut [XSLT] Rassembler des données en colonnes suivant un identifiant
    Salut!
    Je sais pas si mon Intitulé est claire et je sais pas si ma question le sera.
    Le contexte :
    Voila j'ai un fichier XML adresse.xml qui me permettra d'afficher des liens dans des blocs.
    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
    <blocks>
    	<block number="2" name="Google">
    		<a number="2" name="[google] Gmail" imp="true" url="http://www.gmail.com/"/>
    		<a number="3" name="[google] Google" class="red" imp="true" url="http://www.google.fr/"/>
    		<a number="3" name="[google] Outils linguistiques" url="http://www.google.fr/language_tools?hl=fr"/>
    		<a number="3" name="[google] New" url="http://news.google.fr/"/>
    	</block>
    	<block number="4" name="Divers">
    		<a number="5" name="[sf] Open source" imp="true" url="http://www.sourceforge.net/"/>
    		<a number="9" name="[voyage] SNCF" url="http://www.voyages-sncf.com/leisure/fr/launch/home/"/>
    	</block>
    	<block number="4" name="Plan &amp; Adresse">
    		<a number="7" name="[adresse] Pages jaunes" imp="true" url="http://www.pagesjaunes.fr/"/>
    		<a number="8" name="[plan] Mappy" url="http://www.mappy.fr/"/>
    		<a number="8" name="[plan] Via Michelin" imp="true" url="http://www.viamichelin.fr/"/>
    	</block>
    	<block number="7" name="Programmation">
    		<a number="7" name="[developpez] Developpez" url="http://www.developpez.com/"/>
    		<a number="8" name="[developpez] Forums" url="http://www.developpez.net/forums/index.php/"/>
    	</block>
    	<block number="7" name="Mail">
    		<a number="1" name="[mail] La poste" url="http://laposte.net/"/>
    		<a number="1" name="[mail] Hotmail" url="http://www.hotmail.com/"/>
    	</block>
    </blocks>
    Avec un fichier XSL, j'affiche mes différent blocs dans des div et je les tries avec "number" et "name". Le trie me permet d'arranger ma page et d'afficher les blocs de lien dans l'ordre que je souhaite.
    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" 
    	doctype-system="http://www.w3.org/TR/html4/strict.dtd" indent="yes" />
     
    	<xsl:template match="/">
    		<xsl:element name="html">
    			<xsl:element name="head">
    				<xsl:element name="title">Liens</xsl:element>
    				<xsl:element name="link">
    					<xsl:attribute name="type">text/css</xsl:attribute>
    					<xsl:attribute name="rel">stylesheet</xsl:attribute>
    					<xsl:attribute name="href">adresse.css</xsl:attribute>
    				</xsl:element>
    			</xsl:element>
    			<xsl:element name="body">
    				<xsl:element name="div">
    					<xsl:attribute name="class">superblocks</xsl:attribute>
    					<!--xsl:element name="h1">Liens importants</xsl:element-->
    					<xsl:element name="p">
    						<xsl:for-each select="blocks/child::block | blocks/child::*/child::block">
    							<xsl:sort select="@number" />
    							<xsl:sort select="@name" />
    							<xsl:if test="child::a[attribute::imp='true']">
    								<xsl:element name="div">
    									<xsl:attribute name="class">block</xsl:attribute>
    									<xsl:element name="p">
    										<xsl:for-each select="a">
    											<xsl:sort select="@number" />
    											<xsl:sort select="@name" />
    											<xsl:if test="@imp='true'">
    												<xsl:apply-templates select="." />
    											</xsl:if>
    										</xsl:for-each>
    									</xsl:element>
    									<xsl:element name="div">
    										<xsl:attribute name="class">after</xsl:attribute>
    									</xsl:element>
    								</xsl:element>
    							</xsl:if>
    						</xsl:for-each>
    					</xsl:element>
    					<xsl:element name="div">
    						<xsl:attribute name="class">after</xsl:attribute>
    					</xsl:element>
    				</xsl:element>
    				<xsl:element name="div">
    					<xsl:attribute name="class">superblocks</xsl:attribute>
    					<xsl:element name="h1">Liens </xsl:element>
    					<xsl:element name="p">
    						<xsl:for-each select="blocks/block">
    							<xsl:sort select="@number" />
    							<xsl:sort select="@name" />
    							<xsl:apply-templates select="." />
    						</xsl:for-each>
    					</xsl:element>
    					<xsl:element name="div">
    						<xsl:attribute name="class">after</xsl:attribute>
    					</xsl:element>
    				</xsl:element>
    			</xsl:element>
    		</xsl:element>
    	</xsl:template>
     
    	<xsl:template match="block">
    		<xsl:if test="block">
    			<xsl:element name="div">
    				<xsl:attribute name="class">blocks</xsl:attribute>
    				<xsl:if test="@name">
    					<xsl:element name="h1">
    						<xsl:value-of select="@name" />
    					</xsl:element>
    				</xsl:if>
    				<xsl:element name="p">
    					<xsl:for-each select="block">
    						<xsl:sort select="@number" />
    						<xsl:sort select="@name" />
    						<xsl:apply-templates select="." />
    					</xsl:for-each>
    				</xsl:element>
    				<xsl:element name="div">
    					<xsl:attribute name="class">after</xsl:attribute>
    				</xsl:element>
    			</xsl:element>
    		</xsl:if>
    		<xsl:if test="a">
    			<xsl:element name="div">
    				<xsl:attribute name="class">block</xsl:attribute>
    				<xsl:if test="@name">
    					<xsl:element name="h1">
    						<xsl:value-of select="@name" />
    					</xsl:element>
    				</xsl:if>
    				<xsl:element name="p">
    					<xsl:for-each select="a">
    						<xsl:sort select="@number" />
    						<xsl:sort select="@name" />
    						<xsl:apply-templates select="." />
    					</xsl:for-each>
    				</xsl:element>
    				<xsl:element name="div">
    					<xsl:attribute name="class">after</xsl:attribute>
    				</xsl:element>
    			</xsl:element>
    		</xsl:if>
    	</xsl:template>
     
    	<xsl:template match="a">
    		<xsl:if test="@name">
    			<xsl:element name="a">
    				<xsl:attribute name="href">
    					<xsl:value-of select="@url" />
    				</xsl:attribute>
    				<xsl:attribute name="target">_blank</xsl:attribute>
    				<xsl:if test="@imp and not(@class)">
    					<xsl:attribute name="class">important</xsl:attribute>
    				</xsl:if>
    				<xsl:if test="not(@imp) and not(@class)">
    					<xsl:attribute name="class">lien</xsl:attribute>
    				</xsl:if>
    				<xsl:if test="@class">
    					<xsl:attribute name="class"><xsl:value-of select="@class" /></xsl:attribute>
    				</xsl:if>
    				<xsl:value-of select="@name" />
    			</xsl:element>
    		</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>
    Le code du fichier style adresse.css (j'ai mis le minimum pour une bonne présentation)
    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
    html{padding: 0px;}
    body{text-align: center;}
     
    div.superblocks{
    	width : 995px;
    	border: 1px;
    }
    div.superblocks h1{
    	border-bottom: 1px;
    	text-align : center;
    	width : auto;
    }
    div.superblocks p{width : auto;}
    div.blocks{
    	display : inline;
    	float: left;
    	width : 395px;
    	border: 1px;
    }
    div.blocks h1{width : auto;}
    div.blocks p{	width : auto;}
    div.block{
    	display : inline;
    	float: left;
    	width : 185px;
    	border: 1px;
    }
    div.block h1{	width : auto;}
    div.block p{width : auto;}
    a,a.important,a.red{	display: block;}
    a.lien:hover,a.red:hover,a.important:hover{background-color: #e6e6e6;}
    a.important{color:#7d7d7d;}
    a.red{	color:red;}
     
    div.after {clear: both;}
    La problème
    Mais les blocs ne sont pas d'une taille, en hauteur, fixe et qu'avec ma feuille de style je les places les uns après les autres à gauche (je suis pas claire je sais).
    J'arrive avec des troues, verticale, entre les blocs (pas beau ces troues et ca prends beaucoup de place).
    Ce que je souhaite faire, c'est créer des colonnes par "number" et je vois pas comment faire pour mettre les blocs avec le même "number" dans une balise DIV qui me permettra de faire ma colonne.

    Y aura t il un génie en XSL pour résoudre mon problème ou ce que je souhaite faire est impossible en XSL?

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Par défaut
    Ouaip, je pense.
    Sauf que je ne comprend pas le path de la ligne suivante :
    <xsl:apply-templates select="r/t/a[generate-id(.)=generate-id(key('regrouper',.)[1])]"/>

  4. #4
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    Ce n'est pas pour rien qu'il y a un lien sur la methode muench dans cette réponse
    http://xml.developpez.com/faq/?page=3#xslt_doublon

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Par défaut
    Okai! Je vais méditer la dessus ce soir.

    Merci du coup de main ou plutôt du coup oeil cowboy!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Par défaut
    Arg !!! J 'y arrive pas ...
    Je perds a chaque fois les données block qui ont le même number
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" 
    	doctype-system="http://www.w3.org/TR/html4/strict.dtd" indent="yes" />
     
    	<xsl:key name="regrouper" match="block" use="@number"/> 
     
    	<xsl:template match="/">
    		...
    			<xsl:element name="body">
    			...
    				<xsl:element name="div">
    					<xsl:attribute name="class">superblocks</xsl:attribute>
    					....
    					<xsl:element name="p">
    						<xsl:for-each select="blocks/block">
    							<xsl:sort select="@number" />
    							<xsl:sort select="@name" />
    							<xsl:apply-templates select=".[generate-id(.)=generate-id(key('regrouper', @number)[1])]" mode="trie"/>
    						</xsl:for-each>
    					</xsl:element>
    					<xsl:element name="div">
    						<xsl:attribute name="class">after</xsl:attribute>
    					</xsl:element>
    				</xsl:element>
    			</xsl:element>
    		</xsl:element>
    	</xsl:template>
     
    	<xsl:template match="block" mode="trie">
    		<xsl:element name="div">
    			<xsl:attribute name="class">col</xsl:attribute>
    			[<xsl:value-of select="@number" />]
    			<xsl:apply-templates select=".[.=current()]" mode="affiche"/>
    			[/<xsl:value-of select="@number" />]
    		</xsl:element>
    	</xsl:template>
     
    	<xsl:template match="block" mode="affiche">
    		...
    	</xsl:template>
    </xsl:stylesheet>

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

Discussions similaires

  1. [XSLT] Mettre des données dans un attributs de balise html
    Par Jimmy_S dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 03/01/2008, 16h04
  2. Réponses: 2
    Dernier message: 19/01/2007, 07h00
  3. regrouper des données en colonne
    Par antakini dans le forum Access
    Réponses: 4
    Dernier message: 24/11/2006, 14h35
  4. Rassembler des données dans une requete
    Par energies dans le forum Access
    Réponses: 2
    Dernier message: 31/03/2006, 12h39
  5. [XSLT] Réorganisation des données
    Par castaka dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/06/2005, 18h24

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