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 :

PHP5, XSL et <!ENTITY> Problème


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 70
    Par défaut PHP5, XSL et <!ENTITY> Problème
    Bonjour,

    J'ai un fichier Cinema.xml dont voici le code:

    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <!DOCTYPE CINEMA [
       <!ENTITY salle1 SYSTEM "Salle1.xml">
       <!ENTITY salle2 SYSTEM "Salle2.xml">
    ]>
     
    <CINEMA>
       <NOM>Les navires</NOM>
       <ADRESSE>Rue près de la gare de Valence</ADRESSE>
       <METRO>Métro esplanade gare</METRO>
       &salle1;
       &salle2;
    </CINEMA>
    Puis les deux fichiers Salle1.xml et Salle2.xml correspondant aux entités de cinema.xml dont voici le code :

    Salle1.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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <SALLE NO='1' PLACES='320'>
       <FILM>
          <TITRE>Batman Begins</TITRE>
          <AUTEUR>Christopher Nolan</AUTEUR>
          <GENRE>Action aventure</GENRE>
          <ANNEE>2005</ANNEE>
          <PAYS>Etats-unis</PAYS>
          <RESUME>Le résumé de Batman Begins.</RESUME>
       </FILM>
       <REMARQUE>Réservation conseillée.</REMARQUE>
       <REMARQUE>Attention la marche.</REMARQUE>
       <SEANCES>
          <SEANCE>14:00</SEANCE>
          <SEANCE>16:00</SEANCE>
          <SEANCE>21:00</SEANCE>
       </SEANCES>
    </SALLE>

    Salle2.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="ISO-8859-1"?>
     
    <SALLE NO='2' PLACES='120'>
       <FILM>
          <TITRE>Star Wars III : The Revenge of Sith</TITRE>
          <AUTEUR>George Lucas</AUTEUR>
          <GENRE>Action aventure</GENRE>
          <ANNEE>2005</ANNEE>
          <PAYS>Etats-unis</PAYS>
          <RESUME>Comment Anakin Skywalker bascule du côté obscur.</RESUME>
       </FILM>
       <SEANCES>
          <SEANCE>08:00</SEANCE>
          <SEANCE>10:00</SEANCE>
          <SEANCE>12:00</SEANCE>
       </SEANCES>
    </SALLE>

    Puis le document Cinema.xsl dont le code :
    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
     
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
       <xsl:output method="html"/>
     
       <xsl:template match="/">
          <html>
             <head>
                <title>Cinema : <xsl:value-of select="CINEMA/NOM"/></title>
             </head>
             <body bgcolor="white">
                <xsl:apply-templates select="CINEMA"/>
             </body>
          </html>
       </xsl:template>
     
     
     
       <xsl:template match="CINEMA">
          <h1>
             <xsl:value-of select="NOM"/>
          </h1>
          <h1>
             <xsl:value-of select="ADRESSE"/>
          </h1>
          <h1>
             <xsl:value-of select="METRO"/>
          </h1>
          <xsl:apply-templates select="SALLE"/>
       </xsl:template>
     
     
     
       <xsl:template match="SALLE">   
     
          <h2>Salle N° :<xsl:value-of select="@NO"/></h2>     
          <h2>NbPlaces :<xsl:value-of select="@PLACES"/></h2>
          <!-- Film -->
          <h3>Film : <a href="{FILM/TITRE}XML.html"><xsl:value-of select="FILM/TITRE"/></a> </h3>
          de <b><xsl:value-of select="FILM/AUTEUR"/></b>
          <br/><i><xsl:value-of select="FILM/PAYS"/></i>,(<xsl:value-of select="FILM/ANNEE"/>)
          <br/>Resumé:<xsl:value-of select="FILM/RESUME"/>
     
          <!-- boucle sur les séances -->
          <h3>Séances :</h3>
          <ol>
          <xsl:for-each select="SEANCES/SEANCE">
             <li><xsl:value-of select="."/></li>
          </xsl:for-each>
          </ol> 
          <xsl:for-each select="REMARQUE">
             <font color="red"><xsl:value-of select="."/></font>
          </xsl:for-each>
     
       </xsl:template>
    </xsl:stylesheet>
    Puis le fichier Cinema.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
     
    <?
    $docXSL = 'Cinema.xsl';
    $docXML = 'Cinema.xml';
     
    if ( phpversion() <= '5.0.0') die('PHP5 non détecté !');
    else #utilisation du processeur DOM-XML
    {
     
        #chargement du fichier XSL:
        $proc_xsl = new DomDocument();
        $proc_xsl->load( $docXSL );
     
        #chargement du fichier XML:
        $proc_xml = new DomDocument();
        $proc_xml->load($docXML);
     
        #processeur XSLT:
        $xslt = new XsltProcessor();
        $xslt->importStylesheet($proc_xsl);
        $obj = $xslt->transformToDoc($proc_xml);
        $output = $obj->saveXML();
    };
    echo $output;
    ?>
    ###########################
    J'utilise la version PHP 5.0.4 et la dll php_xsl.dll

    Et bien lorsque j'exécute mon fichier Cinema.php et bien je n'ai aucune erreur mais les deux entités (salle1 et salle2) ne sont pas prises en compte.

    Savez vous si c'est un comprortement connu?
    On dirait que Cinema.xsl s'applique sur Cinema.xml avant que Cinema.xml ait chargé les deux entités salle1 et salle2.

    Merci pour votre aide.

    Lionel.

  2. #2
    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
    Bonjour,

    par défaut, il me semble que le parseur de PHP ne valide pas le document XML, même avec une DTD interne. Les entités externes ne seront donc intégrées au document principal que si tu actives la validation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #chargement du fichier XML: 
    $proc_xml = new DomDocument(); 
    $proc_xml->validateOnParse = true;
    $proc_xml->load($docXML);
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 70
    Par défaut
    Merci beaucoup pour cette piste mais ça ne fonctionne pas quand même.
    J'ai même essayé avec $proc_xml->async = false.

    Je ne vois pas d'où ça peut venir. :o/

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 70
    Par défaut [RESOLU]
    J'ai résolu mon problème, il fallait utiliser la propriété substituteEntities pour que le parseur prenne en compte les entités.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #chargement du fichier XML: 
    $proc_xml = new DomDocument(); 
    $proc_xml->substituteEntities = true;
    $proc_xml->load($docXML);
    OK.

    Lionel.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/02/2017, 10h35
  2. [Entity Framework] Problème de visualisation du schema relationnel
    Par Leelith dans le forum Entity Framework
    Réponses: 1
    Dernier message: 15/04/2010, 22h55
  3. Réponses: 2
    Dernier message: 01/03/2010, 21h32
  4. [Entity Framework] Problème avec le Designer
    Par farfadet dans le forum Framework .NET
    Réponses: 16
    Dernier message: 18/02/2010, 13h13
  5. Réponses: 0
    Dernier message: 03/01/2010, 13h40

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