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 :

[XSL 1.0] Xsl:if => Nodeset listant plusieurs contraintes


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut [XSL 1.0] Xsl:if => Nodeset listant plusieurs contraintes
    Hello tout le monde !

    Je suis bloqué dans mon développement pour la raison suivante :

    J'aimerais procéder à un test avec If sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <xsl:for-each select="//Parent">
     
    <Parent>
    <xsl:variable name="$code" select="document('codes.xml')/Codes/."/> <!-- ici le point désigne tout les nodes code qui sont les enfants de Codes -->
    ...
    <xsl:if test="(Enfant[@Code]/.) = ($code)">
    ...
    </xsl:if>
    ...
    </Parent>
     
    </xsl:for-each>
    Le problème c'est que $test représente un node-set venant d'un autre fichier XML.

    Donc le tri ne s'effectue pas et mes balises restent vide...

    Je voudrais savoir comment on peut faire pour tester un node-set (1 par 1 tout les node à l'interieur).

    Pour être plus clair :

    L'expression à laquelle j'aimerais arriver, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:if test="((Enfant[@Code]/.) = (Code1)) or ((Enfant[@Code]/.) = (Code2)) or ((Enfant[@Code]/.) = (Code3)) or ((Enfant[@Code]/.) = (Code4))">
    Mais je ne veut pas le coder en dur, les codes sont stockés dans un fichier XML codes.xml et sont variable selon les utilisateurs.

    J'espère avoir été assez explicite / concis.

    Merci à tous les courageux (ou hargneux) codeurs qui auront le temps de me lire !


  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Avec ça en source:
    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
    <?xml version="1.0" ?>
    <page>
     <parent>
     	<enfant code="1"></enfant>
     </parent>
     <parent>
     	<enfant code="1"></enfant>
     	<enfant code="2"></enfant>
     </parent>
     <parent>
     	<enfant code="1"></enfant>
     	<enfant code="2"></enfant>
     	<enfant code="3"></enfant>
     </parent>
     <parent>
     	<enfant code="2"></enfant>
     	<enfant code="3"></enfant>
     </parent>
     <parent>
     	<enfant code="3"></enfant>
     </parent>
    </page>
    Ca en xml de "jointure"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" ?>
    <Codes> 
     	<code>1</code>
     	<code>2</code>
    </Codes>
    et ça en 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
    <?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" encoding="UTF-8" indent="yes"/>
     
    	<xsl:variable name="codeDoc" select="document('xmlDoc02.xml')"/>
    	<xsl:template match="/"> 
    		<liste>
    			<xsl:apply-templates select="//parent[enfant/@code = $codeDoc//code/.]"/> 
    		</liste>
    	</xsl:template> 
     
    	<xsl:template match="parent"> 
    			<xsl:copy-of select="."/>
    	</xsl:template> 
     
    </xsl:stylesheet>
    On obtient:
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <liste>
    <parent>
    <enfant code="1"></enfant>
    </parent>
    <parent>
    <enfant code="1"></enfant>
    <enfant code="2"></enfant>
    </parent>
    <parent>
    <enfant code="1"></enfant>
    <enfant code="2"></enfant>
    <enfant code="3"></enfant>
    </parent>
    <parent>
    <enfant code="2"></enfant>
    <enfant code="3"></enfant>
    </parent>
    </liste>
    Cad, que les parents ayant un code enfant contenu dans le fichier externe.
    Tu dois pouvoir l'adapter à ton besoin.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Très bien je vais faire un test comme cela et je te tiens au courent pour voir ce que cela donne.

    Merci bien

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Ca ne fonctionne toujours pas !

    C'est étrange car quand je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:value-of select="$codeDoc//code/."/>
    J'obtient le node-set suivant:

    Mais impossible de comparer mon égalité.

    Quelqu'un à une idée ?

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Tu peux me montrer tes xml?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Je commence un peu à désespérer :

    Voila à peu près mon XML source (enfants.xml) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <parent>
     	<enfant name="code">08</enfant>
    	<enfant name="nom">Robert</enfant>
    	<enfant name="prenom">Jean</enfant>
    </parent>
     <parent>
     	<enfant name="code">59</enfant>
    	<enfant name="nom">Yves</enfant>
    	<enfant name="prenom">Pierre</enfant>
    </parent>
    Le XML Code (code.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
     
    …
    <rubrique type='1'>
    <code>01</code>
    <code>08</code>
    <rubrique> 
    …
     
    …
    <rubrique type='56'>
    <code>28</code>
    <code>59</code>
    <rubrique>

    Le XSL de ce que j’aimerais faire ou $code fait référence document() à code.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    …
    <rubrique type='{@type}'>		
    <xsl:for-each select="//enfant[@name='code' and . = number($code/.)]">
    	<xsl:copy select=".">
    	      <xsl:value-of select="."/>
    	</xsl:copy>
     
    </xsl:for-each>
    </rubrique>

    Mais vraiment, c'est pas très souple xslt, dommage, j'ai pas le choix...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut


    Je suis en train de tenter des choses horribles !

    du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <xsl:variable name="horrible">
    	<xsl:for-each select="document('code.xml')/rubrique[@type='1']">
    	<xsl:for-each select="code">
    	. =
    	<xsl:value-of select="."/>
    	or
    	</xsl:for-each>
    	</xsl:for-each>
    	</xsl:variable>
    et ensuite plus bas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    <rubrique type=’{@Type}>		
    <xsl:for-each select="//enfant[@name='code' and ($horrible)]">
     
    ...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:apply-templates select="//parent[enfant/@code = $codeDoc//code/.]"/>
    Il filtre seulement avec la prmière valeur du premier node de $codeDoc, mais ignore les frères des noeux code .

    La question est : y'a t'il un moyen de faire comme un for-each mais dans une expression Xpath ? (ouais c'est tiré par les cheveux).

    Merci, bonne soirée.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Et ça?
    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
    <?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" encoding="UTF-8" indent="yes" />
     
       <xsl:variable name="codeDoc" select="document('doc.xml')" />
     
       <xsl:template match="/">
          <liste>
             <xsl:apply-templates select="//parent[enfant[@name='code']/. = $codeDoc//code/.]" />
          </liste>
       </xsl:template>
     
       <xsl:template match="parent">
          <xsl:copy-of select="." />
       </xsl:template>
    </xsl:stylesheet>

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Heu ben non toujours rien ...

    J'ai bien vérifié mais mon output est vide.

    et quand je remplace le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <xsl:apply-templates select="//parent[enfant[@name='code']/. = $codeDoc//code/.]" />
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <xsl:apply-templates select="//parent[enfant[@name='code']/. = '59' ]" />

    Ben il m'affiche touts les enfants / parents.

    Je vais bien devoir trouver une solution détournée avec PhP par exemple.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Ben pour moi ça marchait avec:
    en 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
    <?xml version="1.0" encoding="UTF-8"?>
    <p>
    <parent>
     	<enfant name="code">08</enfant>
    	<enfant name="nom">Robert</enfant>
    	<enfant name="prenom">Jean</enfant>
    </parent>
     <parent>
     	<enfant name="code">59</enfant>
    	<enfant name="nom">Yves</enfant>
    	<enfant name="prenom">Pierre</enfant>
    </parent>
    <parent>
     	<enfant name="code">62</enfant>
    	<enfant name="nom">Jean</enfant>
    	<enfant name="prenom">Jacque</enfant>
    </parent>
    </p>
    en xml de jointure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" ?>
    <p>
    	<rubrique type='1'>
    		<code>01</code>
    		<code>08</code>
    	</rubrique> 
    	<rubrique type='56'>
    		<code>28</code>
    		<code>59</code>
    	</rubrique>
    </p>
    et en 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
    <?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" encoding="UTF-8" indent="yes" />
     
       <xsl:variable name="codeDoc" select="document('doc.xml')" />
     
       <xsl:template match="/">
          <liste>
             <xsl:apply-templates select="//parent[enfant[@name='code']/. = $codeDoc//code/.]" />
          </liste>
       </xsl:template>
     
       <xsl:template match="parent">
          <xsl:copy-of select="." />
       </xsl:template>
    </xsl:stylesheet>
    J'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
    <liste>
    <parent>
    <enfant name="code">08</enfant>
    <enfant name="nom">Robert</enfant>
    <enfant name="prenom">Jean</enfant>
    </parent>
    <parent>
    <enfant name="code">59</enfant>
    <enfant name="nom">Yves</enfant>
    <enfant name="prenom">Pierre</enfant>
    </parent>
    </liste>
    Cad, que les parent ayant des enfants dont le code est dans le xml de jointure. Mais par rapport à toi je ne prend pas du tout en compte les rubriques.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Ok, c'est clair que c'est fonctionnel, et je te remercie d'ailleur beaucoup pour ton aide .

    Comme tu t'en doute, mon projet est un peut plus complexe, alors j'ai fait un mélange entre ta solution et une génération dynamique de XSLT.

    C'est à dire que PhP va générer un XSLT en fonction de doc.xml, ou il y a les codes (c'est pour tenir compte des rubriques), et j'ai coller dedans ta structure de template qui marche bien, ça m'évite de passer par des (code/. = 'x') or (code/. = 'y') etc ....

    Mais je t'avoue que depuis que je me suis remis dans PHP 5.0 avec SimpleXML (fonction sympatqiue pour parser simplement des XML et les transformer), XSLT commence à me donner la nausée hihi .

    En tout cas merci encore et big up !

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

Discussions similaires

  1. Inclure un .xsl dans un .XSL
    Par Oby dans le forum InfoPath
    Réponses: 1
    Dernier message: 04/05/2006, 15h41
  2. [VB6][XML/XSL] récupérer les xsl:message
    Par memepaspeur2 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/03/2006, 18h07
  3. utilisation de xsl:if et xsl:choose xsl: when
    Par moh_yougo dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 30/01/2006, 15h16
  4. [XSL] Uppercase en xsl ?
    Par Trin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/11/2005, 09h55
  5. [XSL]problème avec <xsl:when>
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 27/05/2005, 16h54

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