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

JavaScript Discussion :

Javascript XML XSL


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 10
    Points
    10
    Par défaut Javascript XML XSL
    Bonjour,
    Je souhaite juste charger un document XML et un document XSL afin de les fusionner pour afficher le résultat dans un div.

    Mais je butte sur un tas de problèmes.
    Les variables xml et xsl sont bien déclarées comme des objets dans load_xml ou load_xsl mais sont à null dans load_file.
    Je les ai mis en globales car je ne les récupérais pas non plus en objets par un return de la fonction.
    Ce script me fait des trucs bizarres, j'ai mis en commentaire l'appel de la fonction devant m'afficher le résultat de la fusion.
    Si je fais un alert de xml dans load_xml par exemple, je peux avoir plusieurs boîtes qui s'affichent.

    Mes deux fichiers se fusionnent bien si j'ouvre le XML dans un navigateur, c'est juste un listing bête et méchant des données XML.

    Voici le code (un amalgame de ce que j'ai pu trouvé sur le net) et merci pour vos réponses :

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <SCRIPT language="Javascript">
    <!--
      var xhr = null;
      var xml = null;
      var xsl = null;
    
      function getXhr(){
       if(window.XMLHttpRequest){ // Firefox et autres
         xhr = new XMLHttpRequest();
        if (xhr.overrideMimeType) xhr.overrideMimeType('text/xml'); 
       } 
       else if(window.ActiveXObject){ // Internet Explorer 
         try {
           xhr = new ActiveXObject("Msxml2.XMLHTTP");
         }
        catch (e) {
          xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        if (xhr.overrideMimeType) xhr.overrideMimeType('text/xml'); 
       }
       else {
         alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
         xhr = false;
       }
      }
    
      function load_xml(value){
        getXhr();
        xhr.onreadystatechange = function(){
         if(xhr.readyState == 4 && xhr.status == 200){
            xml = xhr.responseXML;
         }
        }
        xhr.open("POST","http://localhost/XML/essai.xml",true);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        //xhr.setRequestHeader("Connection", "close");
        xhr.send("quoi="+value);
      }
    
      function load_xsl(nomfichier){
        getXhr();
        xhr.onreadystatechange = function(){
         if(xhr.readyState == 4 && xhr.status == 200){
            xsl = xhr.responseXML;
         }
        }
        xhr.open("GET","http://localhost/XML/essai.xsl",true);
        xhr.send(null);
      }
    
      function transform(ident) { 
        try { /* Navigateur basé sur Gecko. */ 
          if (window.XSLTProcessor) { 
            var xsltProcessor = new XSLTProcessor(); 
            xsltProcessor.importStylesheet(xsl); 
            var fragment = xsltProcessor.transformToFragment(xml, document); 
            var target = document.getElementById(ident); 
           rng = document.createRange();
           rng.setStartBefore(target);
           while (target.hasChildNodes())target.removeChild(target.lastChild);
           target.appendChild(fragment);
          } 
          else if (window.ActiveXObject) { /* ActiveX pour Internet Explorer. */ 
            document.getElementById(ident).innerHTML = xml.transformNode(xsl); 
          } 
        } 
        catch (e) { 
          return e; 
        } 
      } 
    
      function load_file(xml_charger, xsl_charger, ident, valeur_liste) { 
        load_xml(xml_charger);
        load_xsl(xsl_charger+".xsl");
        //var fichier = transform(ident); 
      }
    
    function getList(valeur_liste, nom_div_liste){
      if (nom_div_liste=='exposition_vents'){
        load_file(nom_div_liste, nom_div_liste, nom_div_liste, valeur_liste);
      }
    }
    
    -->
    </script><title>Test xml</title>
    </head>
    <body>
    
      <FORM NAME="form1" ACTION="index.php" METHOD="POST" >
       <div id="exposition_vents">
           <select id="form_exposition" onChange="getList(this.options[this.selectedIndex].value, 'exposition_vents');">
          <option value='1'>un</option>
         <option value='2'>deux</option>
        </select>
      </div>
      </FORM>
    
      <script>getList('1', 'exposition_vents');</script>
    
    </body>
    </html>
    Voilà voilà, désolé pour les balises code

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Pourrais-tu éditer ton message et ajouter des [code]...[/code] autour de ton code, s'il te plaît ?

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Personne n'a un élément de réponse ?

    Je suis passé en mode asynchrone et il y a du mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xhr.open("POST","http://localhost/XML/essai.xml",false);
    et
    xhr.open("GET","http://localhost/XML/essai.xsl",false);
    Les variables xml et xsl sont bien renseignées en tant qu'objets.
    Mais la fusion ne se fait pas car mon innerHTML ne m'affiche rien.

  4. #4
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //var fichier = transform(ident);
    enlève les // ?

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Ok !

    Merci pour ton post.

    Bon, j'ai réactivé le traitement de la fusion.
    Ca ne marchait pas jusqu'à ce que j'ouvre mon fichier XML et que je vire les deux lignes vierges du début.
    Il s'agit d'un problème que j'essaye de résoudre aussi depuis le commencement (je fais mon test sur un fichier statique mais le but est de récupérer dynamiquement de l'XML généré sur un serveur), la génération de l'XML me créé deux lignes vierges.

    Mon div est actuellement remplacé par mes données XML, à moi de me démerder pour recréer mes listes en <select> <option> (pas évident).

    Par contre, ca ne marche pas du tout sous firefox ?

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Bon,

    voici mon fichier 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
     
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <listes>
      <liste nom="exposition1" VALEUR_DEFAUT="NORM">
        <ligne>
          <ident>ABRI</ident>
          <libelle>Site abrite</libelle>
        </ligne>
        <ligne>
          <ident>NORM</ident>
          <libelle>Exposition normale</libelle>
        </ligne>
        <ligne>
          <ident>EXP</ident>
          <libelle>Site expose</libelle>
        </ligne>
      </liste>
      <liste nom="exposition2" VALEUR_DEFAUT="NORM">
        <ligne>
          <ident>ABRI</ident>
          <libelle>Site abrite</libelle>
        </ligne>
        <ligne>
          <ident>NORM</ident>
          <libelle>Exposition normale</libelle>
        </ligne>
        <ligne>
          <ident>EXP</ident>
          <libelle>Site expose</libelle>
        </ligne>
      </liste>
    </listes>
    et mon fichier 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
     
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="html" encoding="ISO-8859-1"/>
      <xsl:template match="/">
        ESSAI AFFICHAGE HTML
        <xsl:for-each select="listes/liste">
          <p><xsl:element name="select">
            <xsl:attribute name="name"><xsl:value-of select="@nom"/></xsl:attribute>
            <xsl:for-each select="listes/liste/ligne">
              <xsl:element name="option">
                <xsl:attribute name="value"><xsl:value-of select="ident"/></xsl:attribute>
                <xsl:value-of select="libelle"/>
              </xsl:element>
            </xsl:for-each>
          </xsl:element></p>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
    Il m'affiche actuellement le texte plus les 3 listes déroulantes mais vides.
    Impossible de les remplir.

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Voici la fin du problème.

    Mon code xsl comportait cette balise <xsl:for-each select="listes/liste/ligne">
    Je pensais bien faire en reportant toute l'areborescence menant au noeud ligne
    En fait, il suffisait juste de nomer ce noeud comme ceci <xsl:for-each select="ligne">
    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" encoding="ISO-8859-1" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="html" encoding="ISO-8859-1"/>
      <xsl:template match="/">
    	  ESSAI AFFICHAGE HTML
     	  <xsl:for-each select="listes/liste">
    		  <p><xsl:element name="select">
     
    			  <xsl:attribute name="name"><xsl:value-of select="@nom"/></xsl:attribute>
     
     	      <xsl:for-each select="ligne">
              <xsl:element name="option">
                <xsl:attribute name="value"><xsl:value-of select="ident"/></xsl:attribute>
                <xsl:value-of select="libelle"/>
    			    </xsl:element>
    	      </xsl:for-each>
     
    			</xsl:element></p>
    	  </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>

    Pour le problème Firefox, il y avait un bug de Mozilla, la réponse se trouve ici :
    http://www.developpez.net/forums/sho...d.php?t=253629


    Voilà...

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

Discussions similaires

  1. [JavaScript - XML/XSL] fonction et filtre
    Par arkham55 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 03/05/2010, 20h06
  2. [DOM] XML+XSL: JavaScript peut-il modifier le XML? ou le DOM?
    Par maskim dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/12/2007, 15h05
  3. Réponses: 2
    Dernier message: 26/07/2007, 09h27
  4. XML - XSL et Javascript
    Par tiboel dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 01/03/2006, 12h50
  5. [XML][XSL][DOM][JAVASCRIPT]melanger le tout, laisser reposer
    Par mitsein dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 16/07/2004, 16h56

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