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 :

Utilisation variables XSL


Sujet :

XML/XSL et SOAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut Utilisation variables XSL
    Bonjour,

    je me permet de vous solliciter pour un problème XSL qui va peut être vous sembler basique. Ceci dit, je débute (3j) en XML/XSL et on me demande au plus vite de faire une modification XSL :
    Dans le code suivant, je fais un count et un select pour insertion dans une BDD sur un substring = 'D'. Or, ces compteurs doivent accepter d'autres valeurs : 'A' , 'F', ''X' et je ne sais comment modifier les lignes en rouge.

    Aussi, toute aide et/ou piste est la bienvenue.

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <xsl:choose>
    	<xsl:when test="count(/Equip/Elt[ArticlePtr[
    			attribute::PartNum=$PartNum and attribute::MajInd=$MajInd and attribute::MinInd=$MinInd and
    			attribute::IndiceQuality=$Quality and attribute::Version=$Version
    			]]/ArtElmt/ArtPart/PartPtr[substring(attribute::PartNum,1,1)='D']) > 0 ">
    		<xsl:for-each select="/Equip/Elt[ArticlePtr[
    			attribute::PartNum=$PartNum and attribute::MajInd=$MajInd and attribute::MinInd=$MinInd and
    			attribute::IndiceQuality=$Quality and attribute::Version=$Version
    			]]/ArtElmt/ArtPart/PartPtr[substring(attribute::PartNum,1,1)='D']">
    			<xsl:if test='position()=1'>				
    				<xsl:value-of select="@PartNum"/>	<xsl:text>', '00', '</xsl:text>
    			</xsl:if>
    		</xsl:for-each>
    	</xsl:when>

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Personnellement je passerais à XSLT 2.0 pour son XPath 2.0 qui simplifie beaucoup. Sinon, j'abandonnerais XSLT et le ferais en Java, C# ou peu importe.

    Quoi qu'il en soit, en XSLT, y a pas besoin de répéter deux fois ces expressions super longues, il suffit d'une variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:variable name="chosenParts" select="/Equip/Elt[expression-de-la-mort]/sur/plusieurs/lignes[complete]"/>
     
    <xsl:choose>
      <xsl:when test="$chosenParts"> <!-- Pas besoin de compter, l'ensemble vide est false -->
        <xsl:for-each select="$chosenParts">
           <!-- ... -->
        </xsl:for-each>
      </xsl:when>
    </xsl:choose>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut
    Merci thelvin pour ta réponse.

    Il est évident que passer par une variable pour des expressions de cette longueur est un avantage.

    Par contre, n'est-il pas possible en XSLT de faire une liste de substring ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [substring(attribute::PartNum,1,1)='D'])
    [substring(attribute::PartNum,1,1)='A'])
    [substring(attribute::PartNum,1,1)='F'])
    [substring(attribute::PartNum,1,1)='X'])
    Du style (je plaisante :oP)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ....
    [substring(attribute::PartNum,1,1)='D' or 'A' or 'F' or 'X'])
    ....

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bah non tu plaisantes pas c'est exactement le genre de trucs qu'il te faut.
    Mais c'est dans un prédicat, c'est donc une question de XPath et pas de XSLT.

    En XPath 1.0 il n'y a rien de ce genre. En XPath 2.0 tu pourrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [some $L in substring(attribute::PartNum,1,1) satisfies ($L = 'D' or $L = 'A' or $L = 'F' or $L = 'X')]
    Sauf que comme c'est du XPath 2.0 il y a plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [substring(attribute::PartNum,1,1) = ('D', 'A', 'F', 'X')]

    Mais pour avoir du XPath 2.0, il faut utiliser XSLT 2.0.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Personnellement, je passerais par une table interne à la feuille de style XSL, ça simplifierait énormément l'expression, donc facilite la lisibilité et la maintenance, et ça fonctionne avec XPath 1.0.

    La création de la table interne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:stylesheet 
           version="1.0" 
           xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
           xmlns:my="une-urn-quelconque">
     
      <my:table>
        <my:prefix>D</my:prefix>
        <my:prefix>A</my:prefix>
        <my:prefix>F</my:prefix>
        <my:prefix>X</my:prefix>
      </my:table>
     
    [...]
    L'utilisation de la table dans un prédicat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [substring(attribute::PartNum,1,1) = document('')/*/my:table/my:prefix]
    document('') renvoie la racine du document XSLT lui-même. Quand on teste l'égalité (ça fonctionne également avec d'autres opérateurs) d'un type simple (la chaîne résultat du substring) avec un node-set (l'ensemble des éléments my:prefix), le test renvoie Vrai si au moins un des noeuds du node-set satisfait le test.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Oooooooh, bricolage, mais bricolage très malin.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [XSL] impossible d'utiliser variable dans expression XPATH
    Par pierre.zelb dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/01/2006, 07h41
  2. Passer la valeur dune variable javascript à une variable xsl
    Par nramariavelo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/12/2005, 17h27
  3. [XSLT] Utilisation variable template
    Par mihaestii dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 23/11/2005, 15h44
  4. Réponses: 16
    Dernier message: 07/04/2005, 11h36
  5. Debutant recherche utilisation variable système
    Par agent-zaizai dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/05/2003, 21h53

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