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

XML/XSL et SOAP Discussion :

"Match nul"


Sujet :

XML/XSL et SOAP

  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 446
    Points
    1 446
    Par défaut "Match nul"
    rahhh, c'est bien XSL, mais y'a vraiment des caps à franchir plutôt frustrants, grrrr.

    J'ai un template qui est appelé mais le paramètre passé lors de l'appel n'est pas réellement transmis. Et je ne vois pas la raison obscure de la force

    soit le doc 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
    <DATAS>
    	<STAGIAIRES>
    		<STAGIAIRE>
    			<NOM>JAMES</NOM>
    			<PRENOM>Sylvain</PRENOM>
    		</STAGIAIRE>
    		<STAGIAIRE>
    			<NOM>TOTO</NOM>
    			<PRENOM>Ratagno</PRENOM>
    		</STAGIAIRE>
    	</STAGIAIRES>
    	<html>
    		<head>
    			<title>essai template</title>
    			<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
    		</head>
    		<body>
    			<table width="50%" border="1">
    				<tr>
    					<td>
    						<a name="nom"/>
    					</td>
    					<td>
    						<a name="prenom"/>
    					</td>
    				</tr>
    			</table>
    		</body>
    	</html>
    </DATAS>
    et le doc XSL :

    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
    <xsl&#58;stylesheet version="1.0" xmlns&#58;xsl="http&#58;//www.w3.org/1999/XSL/Transform">
    	<xsl&#58;output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl&#58;template match="/">
    		<xsl&#58;apply-templates/>
    	</xsl&#58;template>
    	<xsl&#58;template match="html//*">
    		<xsl&#58;param name="stagiaire"/>
    		<xsl&#58;if test="name&#40;&#41; ='a'">
    			<xsl&#58;value-of select="$stagiaire/NOM"/>
    		</xsl&#58;if>
    		<xsl&#58;if test="name&#40;&#41; !='a'">
    			<xsl&#58;copy>
    				<xsl&#58;apply-templates/>
    			</xsl&#58;copy>
    		</xsl&#58;if>
    	</xsl&#58;template>
    	<xsl&#58;template match="STAGIAIRE">
    		<xsl&#58;apply-templates select="//html">
    			<xsl&#58;with-param name="stagiaire" select="."/>
    		</xsl&#58;apply-templates>
    	</xsl&#58;template>
    </xsl&#58;stylesheet>
    Le template match="STAGIAIRE" déclenche l'appel des templates matchant //html mais surtout en passant en paramètre le stagiaire courant.
    Ensuite le template <xsl:template match="html//*"> est déclenché mais à la lecture du parmaètre on a rien quedale. rah.

    Si j'ajoute une règle, et que je l'appelle avec Call-Template en passant le même paramètre, cette fois il est bien passé.
    J'en déduis que le paramètre doit être lié au noeud contexte quelque part, non ?

    Sylvain
    .NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

    Mon Blog : http://blog.developpez.com/index.php?blog=89
    Mes Articles : http://sjames.developpez.com/
    Rubrique XMLRAD: http://xmlrad.developpez.com

  2. #2
    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
    1) le template html//* va être appelé une fois de plus donc il faut commencer avec apply-templates match="//STAGIAIRE" pour ne traiter que les html par stagiaires.

    2)attention de rappeler apply-templates avec le paramètre stagiaire dans le template qui analyse les noeuds html//* sinon le param part dans un trou noir au prochain appel(le pauvre)

    De même html//* ne traite QUE les fils de html et pas html lui même du coup xlst ne trouvant pas la règle html, il exécute le template par défaut et appelle le templates de ses fils (que tu as défini par contre). Mais entre-temps le paramètre s'est perdu dans la nature. En fait c'est ici qu'il tombe dans le trou noir...

    ouf! je commencais à me dire qu'il y avait vraiment un bug dans XSLT.

    bon comme je ne crois pas avoir été très clair vu l'heure, voici ton fichier xslt remis en état.

    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
    <xsl&#58;stylesheet version="1.0" xmlns&#58;xsl="http&#58;//www.w3.org/1999/XSL/Transform"> 
       <xsl&#58;output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
       <xsl&#58;template match="/"> 
          <xsl&#58;apply-templates select="//STAGIAIRE"/> 
       </xsl&#58;template> 
       <xsl&#58;template match="html|html//*"> 
          <xsl&#58;param name="stagiaire"/> 
          <xsl&#58;if test="name&#40;&#41; ='a'"> 
             <xsl&#58;value-of select="$stagiaire/NOM"/> 
          </xsl&#58;if> 
          <xsl&#58;if test="name&#40;&#41; !='a'"> 
             <xsl&#58;copy> 
         <xsl&#58;apply-templates> 
             <xsl&#58;with-param name="stagiaire" select="$stagiaire"/> 
          </xsl&#58;apply-templates> 
              </xsl&#58;copy> 
          </xsl&#58;if> 
       </xsl&#58;template> 
       <xsl&#58;template match="STAGIAIRE">
          <xsl&#58;apply-templates select="/DATAS/html"> 
             <xsl&#58;with-param name="stagiaire" select="."/> 
          </xsl&#58;apply-templates> 
       </xsl&#58;template> 
    </xsl&#58;stylesheet>
    "Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses."
    --Scott Adams

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 446
    Points
    1 446
    Par défaut
    1) le template html//* va être appelé une fois de plus donc il faut commencer avec apply-templates match="//STAGIAIRE" pour ne traiter que les html par stagiaires.
    je me disais aussi, j'ai foiré quelque chose dans XPath :-)

    2)attention de rappeler apply-templates avec le paramètre stagiaire dans le template qui analyse les noeuds html//* sinon le param part dans un trou noir au prochain appel(le pauvre)
    ah la récursivité ! Je m'étais aperçu de ça mais j'ai pas du poster avec cette version de xsl puisqu'elle ne marchait pas.

    Merci beaucoup t'es un chef, ça fonctionne nickel. Par contre je ne comprend pas pourquoi mon paramètre passe quand (ta version) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl&#58;template match="html|html//*">
    et ne passe pas quand :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl&#58;template match="html//*">
    Merci encore,

    Sylvain
    .NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

    Mon Blog : http://blog.developpez.com/index.php?blog=89
    Mes Articles : http://sjames.developpez.com/
    Rubrique XMLRAD: http://xmlrad.developpez.com

  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
    ben en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl&#58;template match="html//*">
    ne matche pas le noeud html mais ses fils. Du coup quand XSLT rencontre un noeud html, il applique le template par défaut sans argument d'ou l'évaporation de ton stagiaire (il fume pas un peu de cana lui?)
    "Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses."
    --Scott Adams

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 446
    Points
    1 446
    Par défaut
    ahhh yesss !
    purée c'est subtil mais c'est vrai c'est ça...
    finalement, j'ai juste à concaténer mon modèle XHTML et mon paquet de <STAGIAIRES> mais l'indépendance est conservée.

    Merci énormément,

    Sylvain
    .NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

    Mon Blog : http://blog.developpez.com/index.php?blog=89
    Mes Articles : http://sjames.developpez.com/
    Rubrique XMLRAD: http://xmlrad.developpez.com

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 20h55

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