Ces derniers jours, j'ai étudié xslt pour convertir xml en xhtml. L'article précédent présentait l'utilisation de xslt pour analyser xml en xhtml
En raison de la méthode précédente, xslt doit être. importé directement dans le fichier XML et dans le projet. Le fichier XML utilisé est généré par le système et ne peut fournir que le chemin, mais il n'y a aucun moyen de réécrire le contenu dans le XML. Nous devons donc trouver un moyen de l'associer. xml et xslt en externe Cela permet non seulement d'atteindre l'objectif, mais peut également être appliqué à plusieurs fichiers XML pour une gestion facile.
Commençons par le code. Le module js est utilisé dans le système pour le packaging. L'outil module est spécialement utilisé pour packager js. Je présenterai cet outil dans un prochain article, je ne peux l'utiliser que maintenant et je n'ai pas étudié. ses fonctions sous-jacentes ; ici nous écrivons js dans un fichier, y compris les classes et les méthodes implémentées par les classes
Voici le code js : transform.js
Le code est le suivant :
var XmlDom=function(){ if (window.ActiveXObject) { // IE var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom"]; for (var i=0; i < arrSignatures.length; i++) { try { var oXmlDom = new ActiveXObject(arrSignatures[i]); return oXmlDom; } catch (oError) { //ignore } } throw new Error("你的系统没有安装 MSXML."); } else if(document.implementation.createDocument){ // Firefox var oXmlDom = document.implementation.createDocument("", "", null); return oXmlDom; } else{ throw new Error("浏览器不支持 XML DOM object."); } } var transformXSLT=function(_XML,_XSL) { if (window.Node) { Node.prototype.transformNode = function(XslDom) { var oProcessor = new XSLTProcessor(); oProcessor.importStylesheet(XslDom); var oResultDom = oProcessor.transformToDocument(myXmlDom); var oSerializer = new XMLSerializer(); var sXml = oSerializer.serializeToString(oResultDom, "text/xml"); return sXml; } } var myXmlDom = new XmlDom(); myXmlDom.async=false; var myXslDom = new XmlDom(); myXslDom.async=false; myXmlDom.load(_XML); myXslDom.load(_XSL); var sResult=myXmlDom.transformNode(myXslDom); if(window.ActiveXObject){ if(myXmlDom.parseError.errorCode != 0){ var sError=myXmlDom.parseError; var txt = ""; txt += "<br>错误代码: "; txt += sError.errorCode; txt += "<br>错误原因: "; txt += sError.reason; txt += "<br>错误行号: "; txt += sError.line; document.write(txt); }else{ document.write(sResult); } }else if(document.implementation.createDocument){ var oSerializer = new XMLSerializer(); var sXmlDom = oSerializer.serializeToString(myXmlDom, "text/xml"); var oParser = new DOMParser(); var oXmlDom = oParser.parseFromString(sXmlDom,"text/xml"); if (oXmlDom.documentElement.tagName == "parsererror") { var oXmlSerializer = new XMLSerializer(); var sXmlError = oXmlSerializer.serializeToString(oXmlDom); alert(sXmlError); } else { document.write(sResult); } } } var TransformBinder = function(XML,XSL) { this.XML = XML; this.XSL = XSL; } TransformBinder.prototype.registerAction = function(handlers) { this.handlers = handlers; } TransformBinder.prototype.bind = function() { var _this = this; this.handlers(_this.XML,_this.XSL); }
Ce qui suit est le code html :
Le constructeur xmlDom est utilisé pour créer l'élément dom de xml
Pour différentes versions de XML ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom"] sous IE, utiliser pour Parcourez pour trouver la version correspondante, puis utilisez new ActiveXObject(arrSignatures[i]) pour créer le dom ;
Utilisez document.implementation.createDocument("", "", null sous FF pour créer directement le dom ;<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type='text/javascript' src="transform.js"></script> </head> <body> <script type="text/javascript"> var XML = "这里输入XML路径"; var XSL = "这里输入XSL路径"; var tempObj = new TransformBinder(XML,XSL); tempObj.registerAction(transformXSLT); tempObj.bind(); </script> </body> </html>
Le constructeur transformXSLT utilise XSLT pour convertir XML en HTML. Il n'y a pas de méthode transformNode sous FF, nous avons donc construit une méthode nous-mêmes
Le code est le suivant : .
Ensuite, utilisez cette méthode pour implémenter la conversion. IE et FF ont des méthodes de traitement différentes pour gérer les erreurs. IE est relativement simple. Il existe un attribut parseError pour charger les informations d'erreur. La raison est la cause de l'erreur. , et la ligne est le mauvais numéro de ligne, et quelques autres informations. Ici, il vous suffit d'afficher le message d'erreur principal. Si une erreur se produit, le contenu de l'erreur est affiché. S'il n'y a pas d'erreur, le résultat de la conversion sResult est affiché. C'est un peu plus compliqué sous FF. Utilisez XMLSerializer et XMLSerializer.serializeToString() pour convertir xmlDom en chaîne, puis convertissez la chaîne en objet dom si une erreur est signalée pendant le processus de conversion, vous pouvez obtenir les informations contenant parsererror. , et jugez-le. Le tagName de l'analyseur de chaîne est-il une erreur ? Si tel est le cas, convertissez l'objet dom en chaîne et supprimez le contenu de la chaîne. Sinon, affichez le résultat de la conversion sResult.
Il y a quelques points à noter ici :
a. IE peut détecter les erreurs DTD dans XML, tandis que FF ne peut détecter que les erreurs grammaticales dans XML lui-même
b Parce que les erreurs doivent être déterminées dans le navigateur ; , le résultat final est difficile à fusionner et la structure du code peut ne pas sembler raisonnable, ce qui est également un geste impuissant.
Le prototype TransformBinder.prototype.registerAction est utilisé pour enregistrer les événements, puis utilisez TransformBinder.prototype.bind pour lier les événements. Lorsque vous devez utiliser cette classe, vous n'avez besoin que d'un nouveau TransformBinder (XML, XSL), enregistrez le. transformXSLT, puis se lier à lier, obtenant ainsi cet effet. Si vous avez besoin de l'étendre, créez un nouveau constructeur, enregistrez-le et liez-le à cette classe pour obtenir l'effet.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!