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 :

Défi Septembre 2004


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut Défi Septembre 2004
    Amateur de casse-tête, bienvenue!
    voici une petite rubrique qui je l'espère va rendre encore plus intéressant le forum xml

    Le but est de trouver une solution à ce défi. Le choix de la meilleure solution se basera sur différents critères, à savoir dans l'ordre d'importance :
    -ca marche!
    -le plus court
    -le plus performant en temps et en mémoire
    -le message le plus ancien.
    La meilleure solution de chaque défi sera publiée dans le message "trucs et astuces xml".

    NB : les solutions sont postées à la suite

    DEFI SEPTEMBRE 2004

    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
    on dispose en entrée d'un fichier xml :
    <fichiers>
      <fichier nom="fic1"/>
      <fichier nom="fic2"/>
      <fichier nom="fic3"/>
      ....
      <fichier nom="ficN"/>
    </fichiers>
     
    Avec une transformation XSLT on souhaite afficher les noms de fichiers par groupes de M dans un tableau html à C colonnes. M et C étant des paramètres donnés.
     
    exemple N=11, M=3, C=3 :
     
    *************************
    * fic1  * fic4  * fic7  *
    * fic2  * fic5  * fic8  *
    * fic3  * fic6  * fic9  *
    *************************
    * fic10 *       *       *
    * fic11 *       *       *
    *       *       *       *
    *************************
      0  0

  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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    un truc pas clair c'est ta separation fic3 fic10 ?
    en attendant les explications vais codes ca par une ligne vide
      0  0

  3. #3
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    je sais j'ai un faible pour le récursif

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:variable name="M" select="3"/>
    	<xsl:variable name="C" select="4"/>
    	<xsl:template match="/">
    		<html>
    			<head>
    				<title/>
    			</head>
    			<body>
    				<table>
    					<xsl:call-template name="ligne">
    						<xsl:with-param name="noeud1" select="//fichier"/>
    						<xsl:with-param name="nb_ligne" select="$M"/>
    					</xsl:call-template>
    				</table>
    			</body>
    		</html>
    	</xsl:template>
    	<xsl:template name="ligne">
    		<xsl:param name="noeud1"/>
    		<xsl:param name="nb_ligne"/>
    		<tr>
    			<xsl:call-template name="cellule">
    				<xsl:with-param name="noeud2" select="$noeud1"/>
    				<xsl:with-param name="nb_cellule" select="$C"/>
    			</xsl:call-template>
    		</tr>
    		<xsl:if test="$noeud1[position()&gt;$C - 1]">
    			<xsl:choose>
    				<xsl:when test="$nb_ligne &gt; 1">
    					<xsl:call-template name="ligne">
    						<xsl:with-param name="noeud1" select="$noeud1[position()&gt;1]"/>
    						<xsl:with-param name="nb_ligne" select="$nb_ligne - 1"/>
    					</xsl:call-template>
    				</xsl:when>
    				<xsl:otherwise>
     
    				<xsl:if test="$noeud1[position()&gt;($M * ($C - 1)+1)]">
    				<tr>	</tr>
    					<xsl:call-template name="ligne">
    						<xsl:with-param name="noeud1" select="$noeud1[position()&gt;($M * ($C - 1)+1)]"/>
    						<xsl:with-param name="nb_ligne" select="$M"/>
    					</xsl:call-template></xsl:if>
     
    				</xsl:otherwise>
    			</xsl:choose>
    		</xsl:if>
    	</xsl:template>
    	<xsl:template name="cellule">
    		<xsl:param name="noeud2"/>
    		<xsl:param name="nb_cellule"/>
    		<td>
    			<xsl:value-of select="$noeud2[1]/@nom"/>
    		</td>
    		<xsl:if test="$nb_cellule &gt; 1">
    			<xsl:call-template name="cellule">
    				<xsl:with-param name="noeud2" select="$noeud2[position()&gt; $M]"/>
    				<xsl:with-param name="nb_cellule" select="$nb_cellule - 1"/>
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>
      0  0

  4. #4
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    ok, je précise le problème :
    chaque cellule du tableau en sortie doit contenir un groupe de M fichiers, sauf pour la dernière cellule qui en contient entre 1 et M.
    De plus il doit y avoir C cellules par ligne.

    Dans mon exemple il y aura 2 lignes car on à au plus M*C=9 fichiers par lignes. Si on avait eu N=19, il y aurait eu 3 lignes et la première cellule de la troisème ligne aurait eu un seul fichier

    On peut voir ce problème comme un double regroupement : M fichiers par cellule et C cellules par lignes...
      0  0

  5. #5
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par Grégory Picavet
    De plus il doit y avoir C cellules par ligne.
    On affiche les vides ?

    si ce n'est pas le cas (mais je préférais ma premiere interprétation + marrante ):
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:variable name="M" select="3"/>
    	<xsl:variable name="C" select="4"/>
    	<xsl:template match="/">
    		<html>
    			<head>
    				<title/>
    			</head>
    			<body>
    				<table>
    					<tbody>
    						<xsl:apply-templates select="//fichier"/>
    					</tbody>
    				</table>
    			</body>
    		</html>
    	</xsl:template>
    	<xsl:template match="fichier">
    		<xsl:if test="position() mod ($M * $C)=1">
    			<xsl:text disable-output-escaping="yes">&lt;tr&gt;</xsl:text>
    		</xsl:if>
    		<xsl:if test="position() mod $M=1">
    			<xsl:text disable-output-escaping="yes">&lt;td&gt;</xsl:text>
    		</xsl:if>
    		<xsl:value-of select="concat(@nom,';')"/>
    		<xsl:if test="position() mod $M=0 or position()=last()">
    			<xsl:text disable-output-escaping="yes">&lt;/td&gt;</xsl:text>
    		</xsl:if>
    		<xsl:if test="position() mod ($M * $C)=0  or position()=last()">
    			<xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
    		</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>
      0  0

  6. #6
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    pas mal, moyennant une petite ruse au niveau de l'écriture des balises sinon le fichier xslt serait mal formé. Mais peux-tu le faire sans? (désolé, mais à ce rythme là, je vais devoir trouver des défis plus durs...)
      0  0

  7. #7
    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
    Bon, c'est peut-être pas aussi rusé que la solution d'erwy, mais ca marche très bien et c'est peut-être plus facile à comprendre pour un débutant habitué aux langages procéduraux ...
    Par contre c'est peut-être un peu plus rapide (moins de requêtes XPath)
    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
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
       <xsl:output method="html"/>
     
       <xsl:variable name="M" select="3"/> 
       <xsl:variable name="C" select="3"/> 
     
    	<xsl:template match="/">
    		<xsl:variable name="nb_lignes" select="ceiling(count(//fichier) div ($M * $C))"/>
    		<html>
    		  <body>
    		  	<table border="1">
    		  	  <xsl:call-template name="ligne">
    		  	  	<xsl:with-param name="nb_lignes" select="$nb_lignes"/>
    		  	  </xsl:call-template>
    		  	</table>
    		  </body>
    		</html>
    	</xsl:template>
     
    	<xsl:template name="ligne">
    		<xsl:param name="cpt_ligne" select="1"/>
    		<xsl:param name="nb_lignes"/>
    		<tr>
    			<xsl:call-template name="colonne">
    				<xsl:with-param name="cpt_ligne" select="$cpt_ligne"/>
    			</xsl:call-template>
    		</tr>
    		<xsl:if test="$cpt_ligne &lt; $nb_lignes">
    			<xsl:call-template name="ligne">
    		    	<xsl:with-param name="cpt_ligne" select="$cpt_ligne + 1"/>
        	    	<xsl:with-param name="nb_lignes" select="$nb_lignes"/>
    		  	</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
     
    	<xsl:template name="colonne">
    		<xsl:param name="cpt_col" select="1"/>
    		<xsl:param name="cpt_ligne"/>
    		<td>
    			<xsl:call-template name="cellule">
    				<xsl:with-param name="cpt_ligne" select="$cpt_ligne"/>
    				<xsl:with-param name="cpt_col" select="$cpt_col"/>
    			</xsl:call-template>
    		</td>
    		<xsl:if test="$cpt_col &lt; $C">
    			<xsl:call-template name="colonne">
    				<xsl:with-param name="cpt_col" select="$cpt_col + 1"/>
    				<xsl:with-param name="cpt_ligne" select="$cpt_ligne"/>				
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
     
    	<xsl:template name="cellule">
    		<xsl:param name="cpt_ligne"/>
    		<xsl:param name="cpt_col"/>
    		<xsl:param name="cpt_valeur" select="1"/>
    		<xsl:value-of select="//fichier[position()= $M * $C * ($cpt_ligne - 1) + $M * ($cpt_col - 1) + $cpt_valeur]/@nom"/>
    		<xsl:if test="$cpt_valeur &lt; $M">
    			<xsl:call-template name="cellule">
    				<xsl:with-param name="cpt_col" select="$cpt_col"/>
    				<xsl:with-param name="cpt_ligne" select="$cpt_ligne"/>				
    				<xsl:with-param name="cpt_valeur" select="$cpt_valeur + 1"/>
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
     
    </xsl:stylesheet>
      0  0

  8. #8
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    EDIT:petite optimisation de place mémoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:with-param name="noeud" select="$noeud[position() &lt; (($M*$C)+1)]"/>
    [position() &lt; (($M*$C)+1)] ajoute pour diminuer la taille du node-set

    autre versionpas copie sur le vieux shnock promis )
    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
     
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:variable name="M" select="3"/>
    	<xsl:variable name="C" select="4"/>
    	<xsl:template match="/">
    		<html>
    			<head>
    				<title/>
    			</head>
    			<body>
    				<table>
    					<tbody>
    						<xsl:call-template name="ligne">
    							<xsl:with-param name="noeud" select="//fichier"/>
    						</xsl:call-template>
    					</tbody>
    				</table>
    			</body>
    		</html>
    	</xsl:template>
    	<xsl:template name="ligne">
    		<xsl:param name="noeud"/>
    		<tr>
    			<xsl:call-template name="cellule">
    				<xsl:with-param name="noeud" select="$noeud[position() &lt; (($M*$C)+1)]"/>
    				<xsl:with-param name="nb_colonne" select="$C"/>
    			</xsl:call-template>
    		</tr>
    		<xsl:if test="$noeud[position() &gt; ($M*$C)]">
    			<xsl:call-template name="ligne">
    				<xsl:with-param name="noeud" select="$noeud[position() &gt; ($M*$C)]"/>
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
    	<xsl:template name="cellule">
    		<xsl:param name="noeud"/>
    		<xsl:param name="nb_colonne"/>
    		<td>
    			<xsl:for-each select="$noeud[position() &lt;($M + 1)]">
    				<xsl:value-of select="concat(@nom,';')"/>
    			</xsl:for-each>
    		</td>
    		<xsl:if test="$noeud[(position() &gt; $M) and ($nb_colonne &gt; 1)]">
    			<xsl:call-template name="cellule">
    				<xsl:with-param name="noeud" select="$noeud[position() &gt; $M]"/>
    				<xsl:with-param name="nb_colonne" select="$nb_colonne - 1"/>
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>
      0  0

  9. #9
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut Re: DEFI SEPTEMBRE 2004
    Citation Envoyé par Grégory Picavet
    Le but est de trouver une solution à ce défi. Le choix de la meilleure solution se basera sur différents critères, à savoir dans l'ordre d'importance :
    ....
    -le plus performant en temps et en mémoire
    ....
    Juste histoire d'être chiant(encore que si tu as des outils ca m'interesse ) comment tu le calcules ça?
      0  0

  10. #10
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    il suffit d'effectuer la transformation en java avec Xalan et de mesurer le temps et la mémoire maximale utilisée par la jvm.

    Bon n'empêche que mes défis ont l'air tout minable, vu la vitesse avec laquelle vous les résolvez...
      0  0

  11. #11
    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
    Quand on cherche le vieux...
    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
    <?xml version="1.0"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     
       <xsl:output method="html"/> 
     
       <xsl:variable name="M" select="5"/> 
       <xsl:variable name="C" select="2"/> 
     
       <xsl:template match="/"> 
          <html> 
            <body> 
               <table border="1"> 
                 <xsl:for-each select="//fichier[position() mod ($M * $C) = 1]"> 
                 	<tr>
                 	  <xsl:for-each select=".|following-sibling::fichier[position() mod $M = 0 and position() &lt; $M * $C]">
                 	  	<td>
                 	  	  <xsl:for-each select=".|following-sibling::fichier[position() &lt; $M]">
                 	  	  	<xsl:value-of select="@nom"/><br/>
                 	  	  </xsl:for-each>
                 	  	</td>
                 	  </xsl:for-each>
                 	  <xsl:if test="position() = last()">
                 	  	<xsl:call-template name="cellules_vides">
                 	  	  <xsl:with-param name="nb" select="$C - ceiling(count(.|following-sibling::fichier) div $M)"/>
                 	  	</xsl:call-template>
                 	  </xsl:if>
    				</tr>
                 </xsl:for-each> 
               </table> 
            </body> 
          </html> 
       </xsl:template> 
     
       <xsl:template name="cellules_vides">
       	<xsl:param name="nb"/>
       	<xsl:if test="$nb &gt;= 1">
       		<td/>
    	  	<xsl:call-template name="cellules_vides">
    	  	  <xsl:with-param name="nb" select="$nb - 1"/>
    	  	</xsl:call-template>
    	</xsl:if>   	
       </xsl:template>
     
     
    </xsl:stylesheet>
    ... et j'ai sauté des lignes, MOI
      0  0

  12. #12
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    forcemment si t'utilise des following-sibling
    j'y avais pense aussi mais je trouves pas la solution elegante
    Ok je dois etre un peu maso


    Grégory Picavet>> Tu veux qu'on t'en trouves des defis

    J'ai même une petite idee sous la main si ca t'interesse
      0  0

  13. #13
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    n'hésites pas alors, j'ai pas trop d'idée ces temps-ci
      0  0

  14. #14
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    soit des fichier de la forme
    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
     
     
    <racine>
    	<n valeur="112">
    		<n valeur="28">
    			<n valeur="3"/>
    			<n valeur="8">
    				<n valeur="4"/>
    				<n valeur="5"/>
    			</n>
    			<n valeur="9">
    				<n valeur="6"/>
    			</n>
    		</n>
    		<n valeur="18">
    			<n valeur="6">
    				<n valeur="7"/>
    			</n>
    			<n valeur="8"/>
    		</n>
    	</n>
    </racine>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <racine>
    	<n valeur="1">
    		<n valeur="2">
    			<n valeur="1"/>
    			<n valeur="2"/>
    		</n>
    		<n valeur="4"/>
    	</n>
    </racine>
    le but faire la somme des @valeur des noeuds valides.
    un noeud est valide
    -si c'est une feuille(qu'il n'est pas le pere d'une autre balise)
    -si son @valeur est superieur a la sommes des @valeur des ses descendants valides
    pour le premier arbre somme=200
    pour le second arbre somme=7

    Ca vous va ou c'est trop facile?(La les modo ont le droit de jouer )
      0  0

  15. #15
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    juste pour info, tu pourrais nous expliqué comment tu trouve 200 au premier arbre
    je suis surement pas douée, mais en tournant le probleme dans tous les sens, j'ai pas reussi à obtenir ca...
      0  0

  16. #16
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    parcours dgd

    112+28+3+0+4+5+9+6+18+0+7+8=200
      0  0

  17. #17
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    a vi...
    n'y a t'il pas u une edition entre les 2
    Bon, ok, c'est deja plus clair, merci
      0  0

  18. #18
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par viena
    a vi...
    n'y a t'il pas u une edition entre les 2
    Bon, ok, c'est deja plus clair, merci
    le ab ,noeud text ,qui trainait d'un ancien test ;en effet pas la derniere version.Mais un text() n'est pas considere comme un child::* par xpath.
    Donc cela ne changeait rien a l'enonce
      0  0

  19. #19
    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
    Désolé Erwy, va falloir trouver plus difficile 8)
    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
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="text"/>
     
      <xsl:template match="/racine">
        <xsl:call-template name="somme">	
          <xsl:with-param name="chaine_valeurs">
            <xsl:call-template name="noeud">
              <xsl:with-param name="selection" select="n[1]"/>
            </xsl:call-template>
          </xsl:with-param>
        </xsl:call-template>	  
      </xsl:template>
     
      <xsl:template name="noeud">
        <xsl:param name="selection"/>
        <xsl:param name="total" select="''"/>
        <xsl:choose>
          <xsl:when test="$selection/n[1]">
            <xsl:variable name="fils_valides">
              <xsl:call-template name="noeud">
                <xsl:with-param name="selection" select="$selection/n[1]"/>
              </xsl:call-template>
            </xsl:variable>
            <xsl:variable name="total_fils">
              <xsl:call-template name="somme">
                <xsl:with-param name="chaine_valeurs" select="$fils_valides"/>
              </xsl:call-template>
            </xsl:variable>
            <xsl:if test="$selection/@valeur &gt; $total_fils">
              <xsl:value-of select="concat($selection/@valeur, ' ')"/>
            </xsl:if>
            <xsl:value-of select="$fils_valides"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="concat($selection/@valeur, ' ')"/>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:if test="$selection/following-sibling::n[1]">
          <xsl:call-template name="noeud">
            <xsl:with-param name="selection" select="$selection/following-sibling::n[1]"/>
          </xsl:call-template>
        </xsl:if>
      </xsl:template>
     
      <xsl:template name="somme">
        <xsl:param name="chaine_valeurs"/>
        <xsl:param name="total" select="0"/>
        <xsl:variable name="item" select="substring-before($chaine_valeurs, ' ')"/>
        <xsl:choose>
          <xsl:when test="$item = ''">
            <xsl:value-of select="$total"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:call-template name="somme">
              <xsl:with-param name="chaine_valeurs" select="substring-after($chaine_valeurs, ' ')"/>
              <xsl:with-param name="total" select="$total + $item"/>
            </xsl:call-template>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:template>
     
    </xsl:stylesheet>
      0  0

  20. #20
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    pas mal,enfin moi j'y arrive sans substring,concat et autres et avec des xpath uniquement a base de racine,child::*,et @valeur(et de variable les utilisant).
    Ah et une seule template nommée.
    Mais c'est pas mal pour un vieux 8)
    (Que veux tu j'applique les principes de l'autre tricheur )
      0  0

Discussions similaires

  1. Votre EDI préferé pour Java (2003-2004) ?
    Par christopheJ dans le forum EDI et Outils pour Java
    Réponses: 73
    Dernier message: 17/10/2005, 17h05
  2. [MX 2004] Flash du dessin
    Par Admin dans le forum Flash
    Réponses: 9
    Dernier message: 23/11/2003, 18h40
  3. [MX 2004] Timer
    Par Admin dans le forum Flash
    Réponses: 5
    Dernier message: 23/11/2003, 00h16
  4. [mx 2004 ] Xml
    Par bolo dans le forum Flash
    Réponses: 10
    Dernier message: 22/11/2003, 23h26

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