这几天一直在研究xslt转换xml为xhtml,前面文章有介绍 使用xslt将xml解析成xhtml 的文章
由于前面的方法xslt需要在xml文件内部直接导入,而项目中用到的xml文件是系统生成的,只能提供路径,而没有办法改写xml里面的内容,所以需要找一个方法能够在外部将xml和xslt关联在一起,这样既达到了目的,也可以应用于多个xml文件,方便管理。
先上代码,系统中使用module这个js进行打包,module这个工具是专门用来将js进行打包,这个工具以后的文章再做介绍,我自己现在只会使用,还没研究其底层的代码;这边我们将js写在一个文件里面,包括类以及类实现的方法,
下面是js代码:transform.js
代码如下:
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); }
下面是html代码:XSLTtransform.htm
代码如下:
<!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>
分析一下transform.js:
xmlDom这个构造函数是用来创建xml的dom元素,对于IE和FF,创建dom的方法不一样,IE是用window.ActiveXObject这个方法来创建,而FF用document.implementation.createDocument这个方法来创建,我们用这两个属性来判断是IE还是FF。
IE下针对不同版本的xml["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument","Microsoft.XmlDom"],用for循环进行遍历查找到对应的版本再new ActiveXObject(arrSignatures[i])建立dom;
FF下用document.implementation.createDocument("", "", null);直接创建dom ;
如果浏览器不支持 XML DOM object则throw错误 。
transformXSLT这个构造函数用XSLT将xml转换成html,FF下没有transformNode这个方法,所以我们自己构造了一个方法,
代码如下:
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; }
然后用这个方法实现转换,在处理错误上IE和FF又有不同的处理方法,IE比较简单,有一个parseError属性装载错误信息,errorCode是错误的代码,reason是错误原因,line是错误的行号,还有其他一些信息,这里只要显示主要的错误信息就可以了,如果出错了就显示出错内容,如果没有出错则显示转换的结果sResult。FF下就比较复杂一点,用XMLSerializer和XMLSerializer.serializeToString()将xmlDom转换为字符串,再将字符串转换成dom对象,在转换的过程中如果报错,就能得到包含有parsererror的信息,判断得到的字符串的tagName是不是parsererror,如果是则将dom对象再转换成字符串抛出字符串中的内容,如果不是则显示转换的结果sResult。
这里有几个注意点:
a.IE能检验出XML的DTD错误,而FF下只能检验出XML本身的语法错误;
b.因为需要在浏览器下判断错误,最终的结果不好合并,可能代码结构上看起来不太合理,这也是无奈之举。
用TransformBinder这个类进行封装,便于扩展和修改。TransformBinder.prototype.registerAction这个原型用于注册事件,再用TransformBinder.prototype.bind将事件进行绑定,需要使用这个类的时候,只需要new TransformBinder(XML,XSL),注册transformXSLT事件,再bind进行绑定,这样就实现这个效果了。如果需要扩展,再创建新的构造函数,注册并绑定到这个类上就可以实现效果。
以上是类TransformBinder将xml解析为xhtml的实例方法的详细内容。更多信息请关注PHP中文网其他相关文章!

用Python读取XML文件的方法包括:1.使用xml.etree.ElementTree库进行基本解析;2.使用lxml库和XPath表达式进行高级解析。通过这些方法,可以高效地处理和提取XML文件中的数据。

将XML数据转换成表格可以通过以下步骤实现:1.解析XML文件,2.将数据映射到表格结构,3.生成表格数据。使用Python的xml.etree.ElementTree和pandas库可以轻松实现这一转换过程。

格式化XML文件的原因是提高人类的阅读和维护效率。1.手动格式化效率低且易出错。2.自动化工具如Notepad 和VisualStudioCode能快速整理XML文件。3.使用Python的xml.dom.minidom模块可以简单格式化XML字符串,但需注意可能添加额外空白节点。

.xsm文件是一种XMLSchema文件,用于定义XML文件的结构和约束。1)使用文本编辑器如Notepad 或VisualStudioCode打开.xsm文件。2)对于高级功能,使用OxygenXMLEditor或AltovaXMLSpy进行Schema验证和自动补全。3)通过Python的lxml库,可以验证XML文件是否符合Schema,并使用流式处理优化大型文件的处理性能。

微信中发送的XML文件可以通过以下步骤打开和处理:1.从微信中提取XML文件:长按文件,选择“保存到手机”或“下载”。2.在不同设备上打开文件:在Windows上使用浏览器或Notepad ,在Mac上使用浏览器或TextEdit,在iOS上使用“文件”应用,在Android上使用“文件管理器”或XML查看器应用。3.理解和使用XML文件内容:通过浏览器或文本编辑器查看文件内容,必要时使用编程语言如Python进行解析和修改。

XML文件的核心作用是存储和传输结构化数据。1)解析XML文件可使用DOM或SAX方法,DOM适合小文件,SAX适合大文件。2)生成XML文件可通过DOM或直接编写。3)处理命名空间时,使用命名空间前缀避免标签冲突。4)调试时,使用验证工具和异常处理。5)优化时,使用SAX解析器和缓存机制。

使用Python可以将xlsx文件转换为xml文件。1)使用openpyxl库读取xlsx文件,2)使用xml.etree.ElementTree库创建和写入xml文件,3)遍历xlsx文件中的数据并填充到xml结构中,4)处理可能遇到的编码、数据类型和缺失值问题。

将发票转换成XML格式可以通过以下步骤实现:1.数据解析:从发票中提取相关信息。2.数据映射:将提取的数据映射到XML结构中。3.XML生成:使用Python的xml.etree.ElementTree模块生成XML文件,这一过程包括逐步构建XML树结构并写入文件。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3汉化版
中文版,非常好用

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)