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] Problème sur une comparaison de deux noeuds


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Points : 39
    Points
    39
    Par défaut [XSLT] Problème sur une comparaison de deux noeuds
    Bonjour,

    Dans un stylesheet, je souhaite effectuer la comparaison de la valeur de deux noeuds dans une balise <xsl:when test=...>

    Mon problème que je dois comparer la valeur intrasèque d'un noeud avec les premiers caractères d'un autre noeud :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <xsl:template-match="/Srv/VrsSrv/VALPRM"
    <xsl:choose>
    <xsl:when test =".=/Srv/Rss/VrsRss/translate(substring-before(VALUE,'toto')">
    <xsl:value-of select="$VAL1"/>
    </xsl:when>
    <xsl:otherwise value-of select="$VAL2"/>
    </xsl:otherwise>
    </xsl:choose>
    </xsl template>
    Mais évidemment cela plante sur le when test car le parser attend un noeud et non une manipulation de chaines sur un noeud. Comment faire ? Merci.

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par NicaeaCivitas
    Mais évidemment cela plante sur le when test car le parser attend un noeud et non une manipulation de chaines sur un noeud.
    Heu non. "xsl:when test" n'attend pas un noeud mais une expression booléene.

    Ton probleme vient certainement du fait que tu compares le noeud et pas son contenu. Essaye en utilisant le noeud "text()".

    <xsl:when test="text()=....">
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Points : 39
    Points
    39
    Par défaut
    Merci pour ta réponse

    Citation Envoyé par pseudocode
    Heu non. "xsl:when test" n'attend pas un noeud mais une expression booléene.
    Je ne pense pas avoir dit que c'était le "xsl:when test" qui attendait un noeud mais plutot le parser. Dans mon exemple, cela est situé après Srv/Rss/VrsRss. Le when:test compare VALPRM et le substring-before de VALUE. C'est pourquoi je ne vois pas en quoi le text() m'avancerait plus car il y aurait toujours le substring-before dans le <xsl:when test>.

    A moins que je n'ai pas bien saisi ce que tu voulais dire ?

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    "test=xxxx" ou xxxx est une expression booléene. Dans ton cas, xxxx est un comparaison:
    - a gauche tu as un noeud (.)
    - a droite une expression xpath qui renvoie une string ( nodes/translate() )

    A priori, ton expression xpath est syntaxiquement fausse. Deja, le nombre de parenthese n'est pas equilibré, et en plus il me semble que translate() prend 3 parametres.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Points : 39
    Points
    39
    Par défaut
    Pour les parenthèses et le translate, c'est parce que j'ai (mal) abrégé le code, en fait après il y a une conversion de caractères minuscules en majuscules, d'où le translate.

    Pour que ça marche tu ferais comment toi pour effectuer une telle comparaison ?

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Deja, je vois pas pourquoi ca plante. Quel est le message d'erreur ?

    Ensuite, donnes nous le code complet du test du xsl:when et un fragment (representatif) de ton fichier xml..
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Points : 39
    Points
    39
    Par défaut
    Merci pour ta patience.

    Alors voici le code du when:test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <xsl:template match="/VrsRss/VrsRssPrm[@IDTPRM='NOMINTPHY']/VALPRM" >
    <xsl:choose>
    <xsl:when test=".= /VrsRss/VrsRssPrm/XipiInt/translate(substring-before(Interface_NAME,'-bidon'), 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')">
      <xsl:value-of select="$_ConfigStatus_1" /> 
      </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$_ConfigStatus_2" /> 
      </xsl:otherwise>
      </xsl:choose>
    Mon bout de XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <VrsRss>
      	<VrsRssPrm ID="CDIDRSS001" IDTPRM="NOMINTPHY" IDTSECT="PHYSICAL">
      		<VALPRM>ATM0/0.1111</VALPRM>
      	</VrsRssPrm>
     	 <VrsRssPrm ID="CDIDRSS001" IDTPRM="ROLE" IDTSECT="">
    	  	<VALPRM>Nominal</VALPRM>  
     
    		  <XipiInt>
    		  	<Interface_NAME>ATM0/0.1111</Interface_NAME>
    		  </XipiInt>
      	</VrsRssPrm>
     </VrsRss>
    Le code plante avec le message suivant :

    ERROR: Description: NodeTest expected here.

    .= /VrsRss/VrsRssPrm/XipiInt/-->translate<--(substring-before(Interface_NAME,'-bidon'), 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')


    C'est le translate dans un noeud qui le gêne. Si je mets le code suivant, ça passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <xsl:when test=".= /VrsRss/VrsRssPrm/XipiInt/Interface_NAME">
    Merci.

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Arf. Je viens de comprendre... Ca aurait du me sauter aux yeux...

    Tu as utilisé la syntaxe XPath dans ton test, du genre noeud1/noeud2/fonction(). Or il faut utiliser la syntaxe fonction( noeud1/noeud2 )

    C'est a dire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <xsl:when test=".=translate(substring-before(/VrsRss/VrsRssPrm/XipiInt/Interface_NAME,'-bidon'), 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')">
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Points : 39
    Points
    39
    Par défaut


    Merci beaucoup à toi. C'était tout bête en fait...

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

Discussions similaires

  1. [XSLT]Problème sur une comparaison if avec des strings
    Par LoDev dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 18/01/2008, 09h27
  2. Réponses: 2
    Dernier message: 27/09/2007, 14h04
  3. Problème sur une expression régulière
    Par Verbal-Quint dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2004, 10h54
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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