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 :

Comment "injecter" un paramètre de l'extérieur ?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut Comment "injecter" un paramètre de l'extérieur ?
    Bonjour,
    Voilà, j'ai un petit programme XML/XSL que j'appelle via une procédure en PHP (voir ci-dessous) et qui fonctionne très bien !
    Ceci dit, j'aimerais que la variable "auteur_choisi" puisse être choisie "de l'extérieur", c'est à dire, par exemple, via la procédure PHP, à travers l'expression de son Url -> Du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://souffle56.ovh.org/Site/Tests/Injection_d_une_variable/PHP.php?auteur_choisi=Dess
    Seulement, une fois la variable Url récupérée en PHP (ou en javascript), comment faire pour que le code XSL puisse lui faire "bon accueil" et l'intégrer

    Si vous avez une idée, par avance un immense Merci !

    Code PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
       $xslDoc = new DOMDocument();
       $xslDoc->load("XSL.xsl");
     
       $xmlDoc = new DOMDocument();
       $xmlDoc->load("XML.xml");
     
       $proc = new XSLTProcessor();
       $proc->importStylesheet($xslDoc);
       echo $proc->transformToXML($xmlDoc);
    ?>
    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?xml version="1.0" encoding="UTF-8"?>
    <enregistrements>
    	<audios>
    		<enseignements>
    			<auteur nom="Dess">
    				<album titre="Un sens à  sa vie !">
    					<largeur>462</largeur>
    					<regroupement sous_titre="Etes-vous heureux ?">
    						<ligne>Certainement !</ligne>
    						<ligne>Assurément !</ligne>
    						<ligne>Ca c'est sûr !</ligne>
    					</regroupement>
    					<regroupement sous_titre="Tout le temps ?">
    						<ligne>Euh !</ligne>
    						<ligne>Ben !</ligne>
    						<ligne>Ca dépend !</ligne>
    					</regroupement>
    				</album>
    			</auteur>
    			<auteur nom="Joe">
    				<album titre="Vive la vie !">
    					<largeur>500</largeur>
    					<regroupement sous_titre="One">
    						<ligne>A</ligne>
    						<ligne>B</ligne>
    						<ligne>C</ligne>
    					</regroupement>
    					<regroupement sous_titre="Two">
    						<ligne>A2</ligne>
    						<ligne>B2</ligne>
    						<ligne>C2</ligne>
    					</regroupement>
    				</album>
    			</auteur>
    		</enseignements>
    	</audios>
    </enregistrements>
    Code 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" 
    encoding="utf-8" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
     
    <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>Audio</title>
    </head>
    <body bgcolor="#FFFFFF">
    <p>Début
    </p>
    <xsl:variable name= "auteur_choisi">Dess</xsl:variable>
    <xsl:apply-templates select="enregistrements/audios/enseignements/auteur[@nom=$auteur_choisi]/album[1]/regroupement" />
    <p>End
    </p>
    </body>
    </html>
    </xsl:template>
     
    <xsl:template match="regroupement">
      <p>
        <xsl:apply-templates select="@sous_titre"/> 
        <xsl:apply-templates select="ligne"/> 
      </p>
    </xsl:template>
     
    <xsl:template match="@sous_titre">
    	* <xsl:value-of select="."/>
    </xsl:template>
     
    <xsl:template match="ligne">
    	- <xsl:value-of select="."/>
    </xsl:template>
     
    </xsl:stylesheet>

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 563
    Points : 21 627
    Points
    21 627
    Par défaut
    Le principe, dans ce cas-là, est de ne pas utiliser une variable XSL, mais un paramètre XSL.

    Reste à voir comment passer la valeur de ce paramètre. Il me semble qu'en PHP, la classe XSLTProcessor a une méthode setParameter() qui sert justement à ça. Mais bon, PHP et moi, ça fait ***** Runtime Error : 128-bits Unsigned Long Overflow

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Merci thelvin,
    Je vais aller voir l'info en question !
    Après, je ne suis pas forcément focalisé sur une procédure PHP -> toute proposition en javascript sera également plus que la bienvenue !

    Avis aux amateurs... hum, et aux "pro" également, plus qu'évidemment !

  4. #4
    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
    Hello,
    En php on peut trouver ça qui devrait marcher (cf exemple 3) :
    http://www.php.net/manual/fr/function.xslt-process.php

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Euh Merci Morbo pour l'info qui parait super intéressante également...
    Après, n'est-ce pas plutôt l'exemple N° 4 que tu voulais me proposer ?

    A propos de cet exemple n°4, je viens de l'essayer, en éxécutant tout simplement le code proposé (ci-dessous)
    -> Voilà ce que l'écran affiche (grrh... restons cool !) :
    Fatal error: Call to undefined function xslt_create() in /home/s/o/u/souffle56/www/Site/Tests/Injection_d_une_variable/PHP2.php on line 23
    Or, la ligne 23, c'est:
    -> Ma version de php (Version 5.2.13) serait-elle allergique à "xslt_create()" ? Qu'en pense-tu ? As tu la même chose de ton coté ?


    Code PHP concerné:

    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
    36
    37
    38
    <?php
     
    // Chaîne XML
    $xml = '<?xml version="1.0"?>
    <para>
     change me
    </para>';
     
    // Chaîne XSL
    $xsl = '
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="ISO-8859-1" indent="no"
     omit-xml-declaration="yes"  media-type="text/html"/>
     <xsl:param name="myvar"/>
     <xsl:param name="mynode"/>
     <xsl:template match="/">
    Ma variable PHP : <xsl:value-of select="$myvar"/><br />
    Mon node set : <xsl:value-of select="$mynode"/>
     </xsl:template>
    </xsl:stylesheet>';
     
     
    $xh = xslt_create();
     
    // le deuxième paramètre sera interprété comme une chaîne
    $parameters = array (
      'myvar' => 'test',
      'mynode' => '<foo>bar</foo>'
    );
     
    $arguments = array (
      '/_xml' => $xml,
      '/_xsl' => $xsl
    );
     
    echo xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments, $parameters);
     
    ?>

  6. #6
    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, je fais plus de php depuis 9 ans .
    Peut être, pose la question dans la partie dédié de ce forum.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Merci Morbo,
    Il se trouve que c'est exactement ce que je viens de faire... Je continue à étudier tout cela, et puis je repasse pour "faire le point"... A + !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Bon ben, ca y est, ça marche !!!

    Après quelques adaptations, voilà le code php qui me permet d'injecter le paramètre "auteur_choisi" au fichier XSL, ainsi que le code de ce fichier XSL, auquel j'ai évidemment retiré la définition interne de ce même paramètre:
    Code PHP:
    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
    <?php
     
    $xsl = new DOMDocument;
    $xsl->load('XSL.xsl');
     
    $xml = new DOMDocument;
    $xml->load('XML.xml');
     
    // Configure le transformateur
    $proc = new XSLTProcessor;
    $proc->importStyleSheet($xsl);
     
    $proc->setParameter(null, 'auteur_choisi', 'Dess');
    echo $proc->transformToXML($xml);
     
    ?>
    Code 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" 
    encoding="utf-8" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
     
    <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>Audio</title>
    </head>
    <body bgcolor="#FFFFFF">
    <p>Début
    </p>
     
    <xsl:apply-templates select="enregistrements/audios/enseignements/auteur[@nom=$auteur_choisi]/album[1]/regroupement" />
    <p>End
    </p>
    </body>
    </html>
    </xsl:template>
     
    <xsl:template match="regroupement">
      <p>
        <xsl:apply-templates select="@sous_titre"/> 
        <xsl:apply-templates select="ligne"/> 
      </p>
    </xsl:template>
     
    <xsl:template match="@sous_titre">
    	* <xsl:value-of select="."/>
    </xsl:template>
     
    <xsl:template match="ligne">
    	- <xsl:value-of select="."/>
    </xsl:template>
     
    </xsl:stylesheet>
    Grand Merci à vous et... Bonne continuation !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/05/2005, 16h58

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