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 :

for-each avec select dans un node-set


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut for-each avec select dans un node-set
    Bonjour,


    je recherche une méthode qui me permettrait d'effectuer une selection de noeuds corrsespondant à une liste d'identifiants définis.

    Par exemple, mes identifiants sont donnés comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:variable name="maselection">
    	<id>2008</id>
    	<id>2004</id>
    	<id>2002</id>
    </xsl:variable>
    Mon arble XML a la forme suivante:
    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
    <document>
    	<elements>
    		<element>
    			<id>2007</id>
    		</element>
    		<element>
    			<id>2006</id>
    		</element>
    		<element>
    			<id>2005</id>
    		</element>
    		<element>
    			<id>2004</id>
    		</element>
    		<element>
    			<id>2003</id>
    		</element>
    		<element>
    			<id>2002</id>
    		</element>
    		<element>
    			<id>2001</id>
    		</element>
    		<element>
    			<id>2000</id>
    		</element>
    	</elements>
    </document>
    Et je voudrais faire une sorte de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="//document/elements/element[where id in $maselection/id]">
    (...)
    </xsl:for-each>

    Voilà, je n'ai pas trouvé la syntaxe équivalente à ce type de requête, donc merci pour vos suggestions.

    Cordialement,

  2. #2
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    Salut,

    Je n'ai pas bien saisi ce que tu veux faire...

    Tu veux récupérer des id précis qui se trouvent dans ton XML ??

  3. #3
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    oui, absoluement

  4. #4
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    Par exemple si tu veux récupérer ton id=2007 :

    tu te mets au niveau document/element/element :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <xsl:template match="id">
     
    <xsl:variable name="ID">
    <xsl:value-of select="."/>
    </xsl:variable>
     
    <xsl:if test="$ID = 2007">
    instructions
    </xsl:if>
    </xsl:template>
    C'est ce que tu veux ??

  5. #5
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    Oui sauf que je ne veux pas 1 seul ID, j'en veux plusieurs et je ne peux prevoir le nombre exacte ni leur valeur, je sais juste que je peux générer une liste des ID désirées sous forme de branche XML.
    Dans ces conditions je ne peux pas ecrire çà dans un if.

  6. #6
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    Tu pourrai me donner un exemple concret de ce que tu veux...

    Pcq la j'ai du mal à comprendre...

  7. #7
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    La liste des valeurs de ID est dynamique, ce ne sera pas toujours 2008, 2006, 2004 ... cette liste de valeur à lister parmis les N éléments est fournies par une autre branche de l'arbre XML, ex:

    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
    <document>
    	<selection>
    		<id>2008</id>
    		<id>2006</id>
    		<id>2004</id>
    		<id>2002</id>
    		<id>2000</id>
    	</selection>
    	<elements>
    		<element>
    			<id>2007</id>
    		</element>
    		<element>
    			<id>2006</id>
    		</element>
    		<element>
    			<id>2005</id>
    		</element>
    		<element>
    			<id>2004</id>
    		</element>
    		<element>
    			<id>2003</id>
    		</element>
    		<element>
    			<id>2002</id>
    		</element>
    		<element>
    			<id>2001</id>
    		</element>
    		<element>
    			<id>2000</id>
    		</element>
    	</elements>
    </document>
    Mon XSL doit lister les éléments de la branche //document/elements/ mais uniquements ceux dont element/id se trouve dans //document/selection/id

  8. #8
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    Donc si j'ai compris, ici, tu ne dois lister que id=2000, id=2002 id=2004 et id=2006 c bien ca ?

    Si c'est ca, je pense qu'il faut que tu mette dans une variable chacun de tes éléments contenus dans selection puis tu testes si ta variables est égale à la valeur de ton id contenus dans element.

    Je ne sais pas si tu me suis ....

  9. #9
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    en effet, je peux mettre ma selection dans une variable dont le type sera un node-set:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="maselection" select="//document/selection/id">
    Seulement après je ne sais pas comment exploiter cette variable dans un for-each:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="//document/elements/element/[ WHERE ID DE ELEMENT EST DANS $maselection ]">

  10. #10
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    et bien une fois que ta variable est récupérée, tu fais un test avec xsl:choose et xsl:when ou xsl:if si tu veux en testant que ta variable soit = id de element il faut donc que tu remontes d'un niveau dans ton arborescence pour redescendre vers element ou sont stockés t id.

    ==>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <xsl:variable name="mavariable2" select="//document/element/element/id"/>
    <xsl:variable name="mavariable" select="//document/selection/id"/>
    <xsl:choose>
    <xsl:when test="$mavariable = $mavariable2">
    instructions
    </xsl:when>
    <xsl:otherwise>
    instructions
    </xsl:otherwise>
    </xsl:choose>
    Voila je ne sais pas si ca marche mais je pense que ca doit être un truc comme ca.

    Bon courage

  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
    Une solution avec msxml en proc xslt, il existe l'equivalent pour xalan et saxon il y même pas besoin de définir de préfixe spécifique.
    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" xmlns:msxml="urn:schemas-microsoft-com:xslt" extension-element-prefixes="msxml">
       <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
     
       <xsl:variable name="maselection"><ids><id>2008</id>  <id>2004</id>  <id>2002</id></ids></xsl:variable>
     
       <xsl:template match="/">
       	<root>
        	<xsl:for-each select="//element[id=msxml:node-set($maselection)//id]">
    			<xsl:copy-of select="."/>
    		</xsl:for-each>
    	</root>
       </xsl:template>
     
     
    </xsl:stylesheet>
    Syntaxe nodeset avec xalan : http://xml.apache.org/xalan-c/extensionslib.html

  12. #12
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    Little_flower: merci beaucoup pour tes propositions, seulement elles ne sont pas envisageables car le nombre de variable à définir n'est pas fixe!

    Morbo: c'est exactement ce que je cherchais ... sauf que je dois mal m'y prendre pour implémenter les méthodes xmlns, j'ai dejà plusieurs essayé d'utiliser les librairies EXSLT mais je n'ai jamais eu le résultat attendu, en général une page blanche après fusion XML+XSL par php :/

    Dans le cas de
    xmlns:msxml="urn:schemas-microsoft-comslt"
    extension-element-prefixes="msxml"

    C'est un peu pareil, je n'ai pas le résultat attendu, non seulement la boucle for-each concernée n'affiche rien mais la suite non plus

    Je vais faire quelques verifications

  13. #13
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    ouais bin nan y a pas moyen de faire fonctionner çà correctement, je sais pas pourquoi mais je ne parviens pas à exploiter uen quelconque fonction msxml, exslt ou autre

    Ca peut etre à cause de PHP ?

    L'application sur laquelle je travaille, enfin j'essaye de travailler, genere une chaine XML à la volée et la fusionne avec un fichier XSL, php doit necessairement interpréter l'instruction msxml:node-set pour savoir quoi faire, je me trompe ? Et apparement il comprend pas...

    Quelque chose m'echappe, çà m'énerve grrr

  14. #14
    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
    Il faut que tu détermine le processeur XSLT qu'utilise php pour déterminer la syntaxe qui gere les nodessets.

  15. #15
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    la syntaxe que j'utilise pour effectuer la fusion est la suivante, basique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?
    (...)
    		$xml = new DOMDocument;
    		$xml->loadXML($xml_src);
     
    		$xsl = new DOMDocument;
    		$proc = new XSLTProcessor;
    		$proc->importStyleSheet($xsl);
     
    		echo $proc->transformToXML($xml);
    (...)
    ?>
    je suis tombé sur ce topic en cherchant des réponses:
    http://www.phpquebec.org/modules/new...ime=1124311249

    je ne comprends pas encore bien ce que je dois faire, dois-je enregistrer tout espace de noms, en php, susceptible d'être appellé par mes différentes feuilles XSLT ?

    Merci d'éclairer ma lanterne

  16. #16
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    j'ai testé le serveur:

    ($xslt -> hasExsltSupport()) = true donc support de EXSLT

    comprend pas

  17. #17
    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
    Si j'ai bien compris, c'est SimpleXML ton processeur XSLT.
    Je ne le connais vu que je fais plus de php depuis un bail, mais la pluspart des processeurs XSLT1.0 ont une syntaxe spécifiques pour gerer les nodes set et elle n'est pas compatible entre eux.
    La syntaxe que j'ai utilisé était propre à MSXML et ne peux donc être reprise, je connais les équivalent pour les processeurs xalan et saxon.
    Je n'est pas non plus utilisé exslt que je connais pas, mais il y a peu être un équivalent de ce coté là aussi.
    Je vais voir si je trouve des info sur simpleXml et les node-sets.

  18. #18
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    alors là je suis largué complet

    comment savoir que l'on utilise "simpleXml" ou un autre comme processeur XSL sous php?

  19. #19
    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
    Apparemment d'après cette page : http://fr2.php.net/xslt Il est possible aussi que sablotron soit le processeur XSLT (qui supporte les recommendationd de la version 1.1). Dans ce cas favorable, pas besoin de syntaxe particuliere et
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    >
       <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
     
       <xsl:variable name="maselection"><ids><id>2008</id>  <id>2004</id>  <id>2002</id></ids></xsl:variable>
     
       <xsl:template match="/">
       	<root>
        	<xsl:for-each select="//element[id=$maselection//id]">
    			<xsl:copy-of select="."/>
    		</xsl:for-each>
    	</root>
       </xsl:template>
     
     
    </xsl:stylesheet>
    devrait marcher.

  20. #20
    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
    Si tu fais un phpinfo() il te mets pas le processeur utilisé?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XSLT] XSLT sort dans un for-each avec select sur un param
    Par tralloc dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 23/11/2012, 09h06
  2. xsl:for-each avec un parametre pour select
    Par arnog dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 26/08/2008, 13h09
  3. [XSLT] Croiser plusieurs xsl:for-each avec deux documents XML
    Par strat0 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 21/06/2007, 16h10
  4. Problème avec Select dans le formulaire
    Par jejefm dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2007, 09h34
  5. [vb.net] For Each .. avec condition
    Par arnolem dans le forum Windows Forms
    Réponses: 8
    Dernier message: 07/12/2005, 09h18

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