Dernière mise à jour :2008-10-15

informatique

Il n'y a aucun doute que si vous désirez développer en XML coté client avec Internet Explorer 5, vous constaterez rapidement que ca n'est pas un jeu d'enfant comme avec Internet Explorer 6.

Lors de la sortie du navigateur Microsoft Internet Explorer 5 en 1998, le parseur XML MSXML inclu avec le logiciel comprennait une implémentation de XSL (Extended StyleSheet Language) [Langage de feuille de style étendu] basée sur une ébauche fonctionnelle (Working Draft) du W3C. La compagnie a continuer à travailler sur le parseur pour suivre le pas des normes exposées par le W3C jusqu'à la recommandation XSLT soit terminée.

Il en résulte donc différentes versions du parseur qui apparaissent dans différentes versions d'Internet Explorer 5, et même parfois dans des sous-ensembles de la même version.

Le tableau ci-dessous présente les différentes versions de MSXML :

Internet Explorer 5.0a

2.0a File version: 5.0.2314.1000

Internet Explorer 5.0b

2.0b File version: 5.0.2614.3500

Internet Explorer 5.01

2.5a File version: 5.0.2919.6303

Internet Explorer 5.01

2.5 File version: 5.0.2920.0

Internet Explorer 5.01, Service Pack 1 (SP1)

2.5 Service Pack 1 (SP1) File version: 8 .0.5226

Internet Explorer 5.5

2.5 Service Pack 1 (SP1) File version: 8.0.5226

On constate que la version 3 du parseur MSXML ne figure pas dans le tableau. Hors, cette version est la première à supporter totalement XSLT et le langage XPath.

Pour réaliser quelque chose de fonctionnel avec les anciennes versions, c'est donc plus compliqué. Les sections suivantes de l'article sont séparées en différents points illustrant différentes situation de possibilité et de limites de transformation coté client.

Transformation XML dans IE 5 avec une ancienne version de MSXML en pointant directement sur l'URL:

Si vous faites la création d'une feuille de style destinée à transformer le contenu d'un fichier XML en format HTML pour fin de visualisation dans un navigateur Internet Explorer 5 qui possède une ancienne version du parseur XML MSXML, vous devrez spécifier l'URI suivante dans la valeur d'attribut d'espace nominal de la balise xsl:stylesheet :

http://www.w3.org/TR/WD-xsl

Remarquez le «WD» à la fin de l'URI. C'est bien la version de la «Working Draft» xsl qui est spécifiée.

Avec le parseur MSXML 3, vous pouvez utiliser cette URI ou encore celle de la recommandation finale soit :

http://www.w3.org/1999/XSL/Transform

De plus, il vous sera retourné une erreur si vous indiquez une méthode de sortie. La ligne de code suivante serait donc rejetée par le parseur :

<xsl:output method="html"/>

Votre feuille de style devra être constituer des éléments de base de XSLT comme par exemple :

  • xsl:attribute
  • xsl:if
  • xsl:for-each
  • xsl:value-of
  • xsl:choose
  • xsl:when
  • xsl:otherwise
  • xsl:template
  • xsl:stylesheet

Il ne vous sera pas possible d'utiliser les éléments :

  • xsl:variable
  • xsl:param
  • xsl:script
  • xsl:pi

ainsi que d'autres éléments qui n'étaient pas implémentés par ces versions du parseur.

Dans le cas du langage XPath, la plupart des expressions de base semblent fonctionner correctement bien que je n'ai pas tester l'ensemble des possibilité. Voici des exemple d'utilisation d'expressions XPath fonctionnelles :

  • //article[auteur = 'Sylvain B']
  • article[auteur != 'Sylvain B']
  • articles/article
  • ../../auteur
  • ./article
  • articles//article/auteur[.='index-fr.htm']

Note : Si on considère que peut être l'élément racine de votre document XML, alors, la commande XPath suivante ne fonctionnera pas :
root//articles[nom = 'Sylvain']
vous devrez plutôt écrire :
//articles[nom = 'Sylvain']

Cette erreur ne se serait pas produite si vous auriez utilisé la propriété XMLDocument au lieu de documentElement dans la méthode transformNode avec un parseur MSXML 3.0 ou plus.

Transformation XML dans IE 5 en utilisant la méthode transformNode en JavaScript ou VBSCript dans un fichier HTML:

Tout comme la méthode précédente, tout fonctionnera correctement si vous n'utilisez que les éléments de base de XSLT.

Voici le listing du code JavaScript qui permet d'indiquer au navigateur d'effectuer la transformation.

Listing 1.0 Code de transformation
<div id="idResultat"></div>
<xml id="idXML"></xml>
<xml id="idXSL"></xml>
<script language="javascript" type="text/javascript">
<!--
idXML.async = false;
idXML.load("document.xml");
idXSL.async = false;
idXSL.load("test.xsl");
var strResultat = idXML.documentElement.transformNode(idXSL.documentElement);
idResultat.innerHTML = strResultat;
// -->
</script>

La balise xml contient un attribut src qui permet d'indiquer la source d'un document XML ou XSL. Par contre, l'utilisation de cet attribut n'est pas possible dans le cas de transformation XML avec un parseur MSXML d'une ancienne version. De plus, l'affectation de la valeur false au propriétés async des balise xml est nécessaire pour dire à IE de télécharger les documents de façon synchrone.

Création d'une page HTML permmettant de télécharger la version 3 du parseur MSXML

L'une des solutions vous permettant de vous éviter bien des problèmes est de permettre à l'utilisateur de télécharger le parseur depuis une page HTML. Il existe cependant deux inconvénient à l'utilisation d'une telle méthode.

La première vient du fait que les gens ont le choix de télécharger ou pas les contrôles activeX. Deuxièmement, les gens qui ont une connexion internet par ligne téléphonique de basse vitesse (56K et moins) préfère souvent ne pas perdre de temps à télécharger ce genre d'objet.

Pour permettre aux gens de télécharger le parseur, vous devez d'abord disposer du fichier ".cab" contenant le nécessaire de distribution de MSXML soit sur votre serveur ou sur un autre. Lorsque j'ai fais la rédaction de cet article, il était possible de télécharger le ".cab" à l'adresse suivante :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmsxml/html/msxmlcabfile.asp

Après avoir placé le fichier cab à l'endroit désiré, vous devez créer une page HTML dans laquelle vous insérez le code suivant :

<object id="MSXML3"
classid="clsid:f5078f19-c551-11d3-89b9-0000f81fe221"
codebase="msxml3.cab#version=8,00,7820,0"
type="application/x-oleobject"
STYLE="display: none">
</object>

Création d'une page HTML permettant de vérifier quel version de MSXML est installée sur l'ordinateur du client

Listing 2.0 - Version de MSXML
1. <HTML>
2. <head>
3. <script language="javascript" type="text/javascript">
4. <!--
5. function MsxmlVersion()
6. {
7.   var strXMLDoc = "";
8.   var blnXMLDOM = false;
9.   var blnMSXML2 = false;
10.   var blnMSXML2_6 = false;
11.   var blnMSXML3 = false;
12.   var blnMSXML4 = false;
13.   var objDOM = "";
14.   var strResultat = "";
15. 
16.   strXMLDoc = "<?xml version=\"1.0\"?><TEST>test</TEST>";
17. 
18.   try
19.   {
20.    objDOM = new ActiveXObject("Microsoft.XMLDOM");
21.    objDOM.async=false;
22.    if (objDOM.loadXML(strXMLDoc))
23.     blnXMLDOM = true ;
24.   }
25.   catch (e)
26.   {
27.    blnXMLDOM = false ;
28.   }
29.   try
31.   {
32.    objDOM = new ActiveXObject("Msxml2.DOMDocument");
33.    objDOM.async=false;
34.    if (objDOM.loadXML(strXMLDoc))
35.     blnMSXML2 = true ;
36.   }
37.   catch (e)
38.   {
39.    blnMSXML2 = false ;
40.   }
41.   try
42.   {
43.    objDOM = new ActiveXObject("Msxml2.DOMDocument.2.6");
44.    objDOM.async=false;
45.    if (objDOM.loadXML(strXMLDoc))
46.     blnMSXML2_6 = true ;
47.   }
48.   catch (e)
49.   {
50.    blnMSXML2_6 = false ;
51.   }
52.   try
53.   {
54.    objDOM = new ActiveXObject("Msxml2.DOMDocument.3.0");
55.    objDOM.async=false;
56.    if (objDOM.loadXML(strXMLDoc))
57.     blnMSXML3 = true ;
58.   }
59.   catch (e)
60.   {
61.    blnMSXML3 = false ;
62.   }
63.   try
64.   {
65.    objDOM = new ActiveXObject("Msxml2.DOMDocument.4.0");
66.    objDOM.async=false;
67.    if (objDOM.loadXML(strXMLDoc))
68.     blnMSXML4 = true ;
69.   }
70.   catch (e)
71.   {
72.    blnMSXML4 = false ;
73.   }
74.   strResultat = "<h2>Voici la liste des parseurs XML de Microsoft installé : </h2>";
75.   strResultat += "<ul>"
76.   strResultat += "<li>XMLDOM : " + blnXMLDOM + "</li>";
77.   strResultat += "<li>MSXML2 : " + blnMSXML2 + "</li>";
78.   strResultat += "<li>MSXML2.6 : " + blnMSXML2_6 + "</li>";
79.   strResultat += "<li>MSXML3 : " + blnMSXML3 + "</li>";
80.   strResultat += "<li>MSXML4 : " + blnMSXML4 + "</li>";
81.   strResultat += "</ul>";
82.   document.writeln(strResultat);
83. }
84. 
85. // -->
86. </script>
87. </head>
88.  <BODY onLoad='MsxmlVersion();'>
89.  </BODY>
90. </HTML>

Voici maintenant un exemple de code fonctionnel dans IE 5 qui transforme un document XML à l'aide d'une feuille de style XSL. Cet exemple prend une partie d'un document XML représentant le plan d'un site web et en affiche une certaine partie. À partir de cette exemple vous pourriez par exemple bâtir un plan de site et un module d'affichage du chemin emprunté par le visiteur du site lors de sa navigation sur celui-ci en vous basant sur un seul fichier xml.

Listing 3.0 - transformation XML -> HTML
1. <html>
2. <head>
3. <title></title>
4. <script language="javascript" type="text/javascript">
5. <!--
6. 
7. function initXML()
8. {
9.   idResultXSL.innerHTML = idSource.transformNode(idStyle.XMLDocument);
10. }
11. 
12. window.onload = initXML;
13. 
14. // -->
15. </script>
16. </head>
17. 
18. <body>
19. <XML id="idSource" src="/programmation/xsl-internet-explorer-1.xml"></XML>
20. 
21. <XML id="idStyle">
22. <HTML xmlns:xsl="http://www.w3.org/TR/WD-xsl">
23.   <body>
24.   <xsl:for-each select="//REPERTOIRE[NOM = 'francais']">
25.    <xsl:if test="FICHIERS//FICHIER[NOM='index-fr.htm']">
26.     <DIV STYLE="font-weight:bold;font-size=16pt">
27.     <a>
28.     <xsl:attribute name="href">
29.     /<xsl:value-of select="../../NOM"/>/index-fr.htm
30.     </xsl:attribute>
31.     <xsl:value-of select="FICHIERS//FICHIER/TITRE"/>
32.     </a> >
33.     </DIV>
34.    </xsl:if>
35.    <xsl:for-each select="REPERTOIRES/REPERTOIRE[NOM = 'programmation']">
36.     <xsl:if test="FICHIERS//FICHIER/NOM[.='index-fr.htm']">
37.      <a>
38.      <xsl:attribute name="href">
39.      /<xsl:value-of select="//REPERTOIRE/REPERTOIRES/REPERTOIRE/NOM"/>/<xsl:value-of select="../../NOM"/>index-fr.htm
40.      </xsl:attribute>
41.      <xsl:value-of select="FICHIERS//FICHIER/TITRE"/>
42.      </a> >
43.     </xsl:if>
44.     <xsl:for-each select="REPERTOIRES/REPERTOIRE[NOM = 'xml']">
45.      <xsl:if test="FICHIERS//FICHIER[NOM = 'index-fr.htm']">
46.       <xsl:value-of select="FICHIERS//FICHIER/TITRE"/>
47.      </xsl:if>
48.     </xsl:for-each>
49.    </xsl:for-each>
50.   </xsl:for-each>
51.   </body>
52. </HTML>
53. </XML>
54. 
55. <DIV id="idResultXSL"></DIV>
56. </body>
57. </html>

Listing 3.1 - Fichier XML à transformer
1. <?xml version="1.0" encoding="iso-8859-1"?>
2. <?xml-stylesheet type="text/xsl" href="/programmation/a525g.xsl"?>
3. <PLAN.DU.SITE>
4. <REPERTOIRE>
5.   <NOM>root</NOM>
6.   <REPERTOIRES>
7.    <REPERTOIRE NIVEAU="1">
8.     <NOM>francais</NOM>
9.     <FICHIERS>
10.      <FICHIER>
11.       <TITRE>Accueil</TITRE>
12.       <NOM>index-fr.htm</NOM>
13.      </FICHIER>
14.     </FICHIERS>
15.     <REPERTOIRES>
16.      <REPERTOIRE NIVEAU="2">
17.       <NOM>intelligence-artificielle</NOM>
18.       <FICHIERS>
19.        <FICHIER>
20.         <TITRE>Intelligence artificielle</TITRE>
21.         <NOM>index-fr.htm</NOM>
22.        </FICHIER>
23.       </FICHIERS>
24.       <REPERTOIRES>
25.        <REPERTOIRE NIVEAU="3">
26.         <NOM>reseaux-neurones</NOM>
27.         <FICHIERS>
28.          <FICHIER>
29.           <TITRE>Catégorie : réseaux de neurones</TITRE>
30.           <NOM>index-fr.htm</NOM>
31.          </FICHIER>
32.          <FICHIER>
33.           <TITRE>Introduction aux réseaux de neurones</TITRE>
34.           <NOM>reseaux-neurones-fr.htm</NOM>
35.          </FICHIER>
36.          <FICHIER>
37.           <TITRE>Algo de rétro-propagation</TITRE>
38.           <NOM>back-prop-fr.htm</NOM>
39.          </FICHIER>
40.         </FICHIERS>
41.        </REPERTOIRE>
42.       </REPERTOIRES>
43.      </REPERTOIRE>
44.      <REPERTOIRE NIVEAU="2">
45.       <NOM>programmation</NOM>
46.       <FICHIERS>
47.        <FICHIER>
48.         <TITRE>Catégorie : Programmation</TITRE>
49.         <NOM>index-fr.htm</NOM>
50.        </FICHIER>
51.       </FICHIERS>
52.       <REPERTOIRES>
53.       <REPERTOIRE NIVEAU="3">
54.        <NOM>xml</NOM>
55.        <FICHIERS>
56.         <FICHIER>
57.          <TITRE>Catégorie : XML</TITRE>
58.          <NOM>index-fr.htm</NOM>
59.         </FICHIER>
60.         <FICHIER>
61.          <TITRE>Introduction à XML</TITRE>
62.          <NOM>intro-xml-fr.htm</NOM>
63.         </FICHIER>
64.        </FICHIERS>
65.       </REPERTOIRE>
66.      </REPERTOIRES>
67.     </REPERTOIRE>
68.    </REPERTOIRES>
69.   </REPERTOIRE>
70.  </REPERTOIRES>
71. </REPERTOIRE>
72. </PLAN.DU.SITE>

Comme vous aurez pu le constater en lisant cet article, exécuter une transformation XML en HTML via XSL coté client avec Internet Explorer 5 n'est pas la chose la plus facile à réaliser. Heureusement, les nouvelles versions d'Internet Explorer ont rapidement remédié à la situation. De plus, Netscape et l'équipe Mozilla.org semble faire des efforts d'intégration de XSLT dans leur navigateur. Nous pouvons donc en conclure que les fonctions de transformation avec XPath, XSLT seront très utilisées dans le futur.

Auteur : Sylvain Bilodeau

Date de mise en ligne : 2002-09-09

Aucun commentaire pour l'instant.