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 :

PHP et XSL


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut [Résolu] PHP et XSL
    Salut,

    J'aimerai savoir comment mettre du code PHP dans mes pages ouaib. Avant, j'avais une page HTML qui passait par une moulinette PHP : ça ne prenait que ce qui il y avait entre <body> et </body> (exclus), et mettait ça dans un modèle après l'avoir passé dans la fonction eval :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval ("?>".$page_html."<?");
    (super bidouille, mais j'ai pas trouvé de fonction plus adaptée en PHP ...)

    Maintenant je suis passé au XML/XSL. Cool, plus besoin de la bidouille PHP pour extraire ce qu'il y a entre <body>. Par contre, je n'arrive plus à écrire de PHP. J'ai tenté d'utiliser des balises <php> et </php> dans mon XML, qui seront codées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="php">
      <xsl:text><?</xsl:text>
      <xsl:value-of select="*|node()" />
      <xsl:text>?></xsl:text>
    </xsl:template>
    (je ne suis plus sûr des codes ASCII, mais 60 ça doit être "<" et 62 ">")

    Lequel je passe dans la fonction eval (ce la même manière que précédement) si nécessaire.

    Problème : à la sortie j'obtiens "&? (code php ?&" ... Comment obtenir "<? (code php ?>;" ? Ou alors avez-vous une meilleure solution.

    @+ Haypo

  2. #2
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    essaye une section CDATA, ou remplace simplement < par & lt;

  3. #3
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    C'est le forum PHP qui a transformé mon code en < et > :-) J'avais écrit : '& #060 ;' et '& #062 ;' (sans espaces)

    Mon problème vient du fait que c'est le moteur XSLT qui transforme & ou '& #060 ;' ou autre CDATA en ... '&' alors que je voudrais du '<' tout court !!!

    @+ Haypo

  4. #4
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    J'ai trouvé, il fallait utiliser xsl:value-of avec disable-output-escaping="yes" ;-) Ce qui nous donne :

    Fichier XSL (main.xsl) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="php">
      <php>
        <xsl:value-of disable-output-escaping="yes" select="*|node()" />
      </php>
    </xsl:template>
    Fichier PHP (index.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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <?
    // Est-ce qu'on est en ligne ?
    $est_en_ligne = 1;
    
    // Paramètres
    $params = Array
    (
      "page" => $page,
      "racine" => $racine,
      "groupe" => $groupe,
      "repertoire" => $repertoire,
      "est_en_ligne" => $est_en_ligne
    );
     
    // Xml and XSL files
    $xml = "xml/".$repertoire.$page.".xml";
    if (!$xsl) $xsl = "html.xsl";
    $xsl = "xsl/".$xsl;
     
    // Allocate a new XSLT processor
    $xh = xslt_create();
    $nom_fich = 'file://' . getcwd () . '/' . $racine;
    xslt_set_base ($xh, $nom_fich);
     
    // Traite le document
    $result = xslt_process($xh, $xml, $xsl, NULL, NULL, $params);
    if (!$result) {
      // ERREUR du parseur XSLT :-(
     
      echo '<p>Erreur XSLT lors du traitement du fichier "'.$xml.'" ';
      echo '('.$nom_fich.')';
      echo 'par la feuille de style "'.$xsl.' :<br>';
     
      echo xslt_error($xh);
      echo ' (numero '.xslt_errno($xh).')';
     
      echo '</p>';
    } else if ($php) {
      // Analyse le code PHP
     
      $ouvre = '<php>';
      $ferme = '</php>';
      while ($pos_start = strpos($result, $ouvre))
      {
        // Ajoute ce qui n'est pas du PHP
        echo substr($result, 0, $pos_start);
     
        // Cherche la balise de fermeture
        $pos_end = strpos($result, $ferme);
        $pos_start += strlen($ouvre);
        if (!$pos_end)
        {
          echo ("ERREUR: Balise fermante '$ferme' introuvable !!!");
          break;
        }
     
        // Evalue le code PHP
        eval(substr($result, $pos_start, $pos_end-$pos_start));
     
        // Passe à la suite
        $result = substr($result, $pos_end+strlen('</php>'));
      }
      echo $result;
    } else {
      // Ecrit la page HTML
      echo $result;
    }
     
    // Destroy the XSLT processor
    xslt_free($xh);
    ?>
    Yahoo! Ca marche !!! (note: je me suis basé sur une astuce trouvée sur le net, dont j'ai perdu l'adresse ...)

    @+ Haypo

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/07/2006, 14h00
  2. [XSLT] Php dans XSL
    Par kivan666 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 08/07/2006, 20h28
  3. Choisir entre php et XSL
    Par vg33 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 15/04/2006, 02h40
  4. PHP/XML/XSL
    Par sami69 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 10/04/2006, 14h30
  5. [XSLT][DOM] Php - Xml - Xsl
    Par topolino dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 08/12/2005, 19h34

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