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 :

problème : axe - param template [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut problème : axe - param template
    Bonjour à tous,

    J'ai encore un petit problème avec xsl. Le problème est le suivant j'ai créé une template nommé avec un param noeud, puis je fait tourner une boucle pour parcourir l'arboresence de répertoire et de fichier. Ensuite j'appel cette template nommé arborescence en passant comme paramètre le type de noeud que je souhaite lister (fichier ou répertoire). Mais XMLSpy bloque sur la condition <xsl:if test="self::$noeud">.......
    alors que lorsque je mets <xsl:if test="self::fichier">....... ça fonctionne. Donc d'après ce que je comprends c'est qu'il n'accepte pas que j'utilise un axe modaux suivie d'un paramètre. Comment je peux faire ? Quel est mon erreur ?

    Voici mes deux fichiers de tests :

    ArboSpy.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
    31
    32
    33
     
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="ArboSpy.xslt"?>
    <racine>
    	<repertoire nom="XML" date-modif="25-02-2001" heure-modif="14:12">
    		Ressource XML (exemples, outils, portail, spécifications...) 
    			<repertoire nom="exemples" date-modif="25-02-2001" heure-modif="14:12">
    				Exemple de fichier XML
    			</repertoire>
    			<fichier nom="seminaire.xml" taille="2" unite-taille="Ko" date-modif="25-02-2001" heure-modif="09:12">
    				Description XML du cours CXML
    			</fichier>
    			<fichier nom="ArboSpy.xml" taille="1" unite-taille="Ko" date-modif="25-02-2001" heure-modif="14:12"/>
    			<repertoire nom="outils" date-modif="25-03-2001" heure-modif="18:22"/>
    	</repertoire>
    	<repertoire nom="Schema" date-modif="19-02-2001" heure-modif="19:09">
    			<repertoire nom="DTD" date-modif="25-02-2001" heure-modif="09:12">
    				Ressources sur les DTD
    				<repertoire nom="outils" date-modif="25-02-2001" heure-modif="19:56"/>
    				<fichier nom="XMLSpy35.exe" taille="8" unite-taille="Mo" date-modif="28-02-2001" heure-modif="12:12">
    					Version d'évaluation auto-installable 
    				</fichier>
    				<fichier nom="cooktop_2_101.msi" taille="4" unite-taille="Mo" date-modif="25-02-2001" heure-modif="09:45">
    					CookTop (éditeur XML, XSLT, DTD) gratuit au fromat MS Installeur. 
    				</fichier>
    			</repertoire>
    			<repertoire nom="XML Schema" date-modif="25-02-2001" heure-modif="14:12"/>
    	</repertoire>
    	<fichier nom="ebXML-Specv1-0.pdf" taille="246" unite-taille="Ko" date-modif="25-02-2001" heure-modif="14:12">
    		Spécification ebXML à ranger dans un répertoire. 
    	</fichier>
    </racine>




    ArboSpy.xslt

    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
     
    <?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" version="1.0" encoding="UTF-8" indent="yes"/>
    			<!-- formatage de l'arboresence -->
    	<xsl:template match="racine">
    		<html>
    			<head>
    				<title>Template-arbre-xslt</title>
    			<!--	<link type="text/css" rel="stylesheet" href="ArboSpy.css"/> -->
    			</head>
    			<body>
    				<div> 
    					<table>
    								<!-- Appel de la template nommé arboresence -->
    							<xsl:call-template name="arborescence">
    								<xsl:with-param name="noeud" select="repertoire"/>
    							</xsl:call-template>
    					</table>
    				</div>
    			</body>
    		</html>
    	</xsl:template>
     
    	<xsl:template name="arborescence">
    		<xsl:param name="noeud"></xsl:param>
    			<!-- L'arboresance du noeud -->
    		<xsl:for-each select="descendant::*">
    			<xsl:if test="self::$noeud">
    				<tr>
    					<td><xsl:value-of select="@nom"/></td>
    				</tr>	
    			</xsl:if>
    		</xsl:for-each>
    	</xsl:template>
    	<xsl:template match="text()"></xsl:template>
    </xsl:stylesheet>
    Donc est ce quelqu'un aurati une idée d'ou pourrait venir le problème, ça fait quelques heures que je tourne, ça me soulagerait vraiment.

    Merci d'avance pour l'aide que vous allez m'apporter.

    dav79

  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
    Par défaut
    il n'est pas le seul qui va bloquer...
    Tu cherche à générer du XPath dynamiquement ,or onn ne peut pas transformer une string en XPath.
    par contre on peut utiliser une variable ou un paramètre de cette façon :

    si c'est une chaine ou un nombre : en test dans un prédicat
    si c'est un noeud ou une ensemble de noeud: en test dans un prédicat ou comme début de xpath

    ici , pour reprendre ton exemple fichier,on est dans le premier cas


  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Merci Erwy, pour ton aide, j'ai testé ta solution dans mon code, mais ça n'affiche rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    <xsl:template name="arborescence">
    		<xsl:param name="noeud"></xsl:param>
    			<!-- L'arboresance du noeud -->
    		<xsl:for-each select="descendant::*">
    			<xsl:if test="self::* [name() = $noeud]">
    				<tr>
    					<td><xsl:value-of select="@nom"/></td>
    				</tr>	
    			</xsl:if>
    		</xsl:for-each>

    ça marche partiellement quand j'utilise current(), mais c'est pas encore le résultat attendu, car je n'obtient pas les enfants de fichier ou répertoire, suivant le paramètres que je passe à la template.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <xsl:template name="arborescence">
    		<xsl:param name="noeud"></xsl:param>
    			<!-- L'arboresance du noeud -->
    		<xsl:for-each select="descendant::*">
    			<xsl:if test="self::* [current() = $noeud]">
    				<tr>
    					<td><xsl:value-of select="@nom"/></td>
    				</tr>	
    			</xsl:if>
    		</xsl:for-each>
    Résultat pour fichier :
    ebXML-Specv1-0.pdf

    Résulat pour répertoire :
    XML
    Schema

    En fait j'aimerais pouvoir obtenir le même résulat que lorsque je n'utilise pas de paramètre c'est à dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    <xsl:template name="arborescence">
    		<xsl:param name="noeud"></xsl:param>
    			<!-- L'arboresance du noeud -->
    		<xsl:for-each select="descendant::*">
    			<xsl:if test="self::repertoire"> <!-- self::fichier -->
    				<tr>
    					<td><xsl:value-of select="@nom"/></td>
    				</tr>	
    			</xsl:if>
    		</xsl:for-each>
    Je ne comprend pas d'ailleurs pourquoi je n'obtiens pas le même résultat

    Résultat obtenu pour repertoire (sans param) :
    XML
    exemples
    outils
    Schema
    DTD
    outils
    XML Schema

    Résultat obtenu pour fichier (sans param) :
    seminaire.xml
    ArboSpy.xml
    XMLSpy35.exe
    cooktop_2_101.msi
    ebXML-Specv1-0.pdf

    Donc voilà, j'espère que je suis claire dans mon explication, Il y a t'il possibilité de convertir un paramètre contenant une chaine en un noeud ? Quelles sont les solutions possibles pour aboutir au résultat que je souhaite c'est à dire lister des fichiers ou répertoire suivant le paramètre que je passe à la template aborescence, avec leurs enfants.

    Est ce quelqu'un aurait des suggestions, des idées pour résoudre ce problème Merci d'avance.

    dav79

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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    tu ne peux pas utiliser ce système pour une arborescence complète, juste pour le nom d'un noeud.

    Il y a une mauvaise vision de ce qu'est un XML et de l'utilisation de XSLT à la base
    Dans ton cas tes noeud ont forcément une clé logique(date modif heure modif , un composé??) basé sur des valeurs, c'est elle que tu dois passer en paramètre et crée un xsl:key l'utilsant comme index.
    Comme dans un SGBD car XML c'est avant tout une structure de donnée

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Oui biensur en pratique on utilise les identifiant ou les clé, mais là c'est un exercie de TP, et je n'est pas aborder la notion xsl:key.

    J'arrive bien à parcourir entièrement l'arboressence des répertoires avec ces instructions, il n'y a pas de problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    <xsl:template name="arborescence">
    		<xsl:param name="noeud"></xsl:param>
    			<!-- L'arboresance du noeud -->
    		<xsl:for-each select="descendant::*">
    			<xsl:if test="self::repertoire"> <!-- self::fichier -->
    				<tr>
    					<td><xsl:value-of select="@nom"/></td>
    				</tr>	
    			</xsl:if>
    		</xsl:for-each>

    Par contre quand j'utilise un paramètre ça coince. Donc je présume quand je ne peut convertir un paramètre en un noeud. Quels autres solutions il me reste sans utiliser les id et xsl:key....

    Et pour je peux parcourir toutes l'arbo avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:for-each select="descendant::*">
       <xsl:if test ="self::nomNoeud">
                  ....................
     
    </xsl:for-each>
    Mais pas avec cette instruction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:for-each select="descendant::*">
       <xsl:if test ="self::*[current() = $nomNoeud]">
                  ....................
     
    </xsl:for-each>

    Je peux rein faire d'autres .....

  6. #6
    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
    Par défaut
    Citation Envoyé par BOLARD Voir le message
    Oui biensur en pratique on utilise les identifiant ou les clé, mais là c'est un exercie de TP, et je n'est pas aborder la notion xsl:key.
    TP ?
    Vous avez du mal comprendre la question alors
    On peut, sur certains parseurs faire du xpath dynamique via des fonctions propriétaires mais c'est très vivement déconseillé.
    Visiblement dans votre structure l'attribut nom du répertoire est unique.
    Donc en passant en paramètre le nom en question on obtient facilement le répertoire en question en faisant un prédicat sur ce dernier

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    J'ai enfin trouvé la réponse pour passer mon paramètre à ma template arborescence soit fichier ou répertoire. Voici la solution pour ceux que ça pourrait intéresser, avec un style css. Pour les fichiers, les répertoires et sous-répertoires

    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
     
     
    <?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" version="1.0" encoding="UTF-8" indent="yes"/>
    			<!-- formatage de l'arboresence -->
     
    	<!-- TEMPLATE racine  -->
    	<xsl:template match="racine">
    		<html>
    			<head>
    				<title>Template-arbre-xslt</title>
    				<link type="text/css" rel="stylesheet" href="ArboSpy.css"/> 
    			</head>
    			<body>
    				<h1>TP PARTIE XSL</h1>
    				<h3>Exercice</h3>
    				<h6>Changer la valeur du with-param pour obtenir tous les répertoires ou tous les fichiers</h6>
    				<div class="bordure"> 
    					<table>
    								<!-- Appel de la template nommé arboresence -->
    							<xsl:call-template name="arborescence">
    									<!-- Paramètre de template -->
    								<xsl:with-param name="noeud" select="name(fichier)"/>
    							</xsl:call-template>
    					</table>
    				</div>
    			</body>
    		</html>
    	</xsl:template>				
     
    		<!-- TEMPLATE arboresence  -->
    	<xsl:template name="arborescence">
    				<!-- contient la chaîne du noeud -->
    			<xsl:param name="noeud" select="self::node()"/>
    				<!-- contient le titre de l'élément -->
    			<xsl:param name="typeNoeud" select="$noeud"/>
     
    			<!-- titre de l'élement (fichier ou repertoire) -->
    		<tr><td class="titre"><xsl:value-of select="$typeNoeud"/></td></tr>
     
    				<!-- Parcourri l'arborescence  -->
    		<xsl:for-each select="descendant::*">
    				<!-- Si chaîne du noeud égal au paramètre de la template -->
    			<xsl:if test="name() = $noeud">
    				<xsl:choose>
    						<!-- Si noeud est un fichier -->
    					<xsl:when test="name() = 'fichier'">
    							<tr>
    								<td><a href="#"><xsl:value-of select="@nom"/></a></td>
    							</tr>	
    					</xsl:when>
    					<xsl:otherwise>
    							<!-- Si noeud est un rerpertoire -->
    						<xsl:choose>
    								<!-- Si noeud repertoire racine -->
    							<xsl:when test="count(child::*)  > 0 and name() = $noeud">
    								<tr>
    									<td class="repertoire"><xsl:value-of select="@nom"/></td>
    								</tr>
    							</xsl:when>
    							<xsl:otherwise>
    									<!-- Si noeud sous-repertoire  -->
    								<tr>
    									<td class="sous-repertoire"><xsl:value-of select="@nom"/></td>
    								</tr>
    							</xsl:otherwise>
    						</xsl:choose>
    					</xsl:otherwise>
    				</xsl:choose>					
    			</xsl:if> 
    		</xsl:for-each>
    	</xsl:template>
    	<xsl:template match="text()"></xsl:template>
    </xsl:stylesheet>
    En espérant que ça pourra aider quelqu'uns

    dav79

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/12/2006, 14h42
  2. Problème std::list + templates GCC/G++ 4.x
    Par Amalsek dans le forum GCC
    Réponses: 5
    Dernier message: 12/05/2006, 11h04
  3. Problème de compilation template
    Par Bourrine dans le forum Langage
    Réponses: 4
    Dernier message: 20/01/2006, 21h15
  4. [XSLT] Problème avec apply-templates
    Par NeoMan dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/12/2005, 14h45

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