XSLT 介绍与 Google Ajaxslt
夏嘉德
2023-12-01
XSLT的英文标准名称为eXtensible Stylesheet Language Transformation。根据W3C的规范说明书(http://www.w3.org/TR/xslt),最早设计XSLT的用意是帮助XML文档(document)转换为其它文档。但是随着发展,XSLT已不仅仅用于将XML转换为HTML或其它文本格式,更全面的定义应该是:XSLT是一种用来转换XML文档结构的语言。 为了使数据便于人们的阅读理解,我们需要将信息显示出来或者打印出来,例如将数据变成一个HTML文件,一个PDF文件,甚至是一段声音;同样,为了使数据适合不同的应用程序,我们必须有能够将一种数据格式转换为另一种数据格式,比如需求格式可能是一个文本文件,一个SQL语句,一个HTTP信息,一定顺序的数据调用等。而XSLT就是我们用来实现这种转换功能的语言。将XML转换为HTML,是目前XSLT最主要的功能。 1.XSLT stylesheets can automate the conversion of the same input into multiple output formats. 2.XSLT一个很大的优势就是可以在任何地方随时在XML数据全局范围内抓取需要的任何数据,不受XML数据结构影响。 3.将数据和表达形式分离。就象天气预报的信息可以显示在不同的设备上,电视,手机或者其它。这样给你一个XML,一个DTD,就可以开发XSLT,而不用关心后台数据如何实现。比如如果有一天突然觉得要换界面了,那么重新做一个xsl就好了,后台的程序和xml的结构完全不需要修改,如果你用传统的方法,由于数据和显示耦合的太紧密,所有的页面都将重写... 4.將XSLT轉化在客戶端進行可以大大減少服務器壓力,服務器只需要將XML數據發送到客戶端,XSLT已經保存在本地,從而减小网络流量. 5.可以很好的避免安全性問題,以XSLT转化得到的页面通过查看源代码得到的只有XML数据。 6.能够很好的适应需求的快速变化,不用修改逻辑代码,不用编译,甚至可以直接在线修改,就可以解决比较一般的需求变化。 7.另外,是因为它专门用来处理xml,它处理xml比DOM方便多了,对于目前盛行的Ajax应用来说,尤其有其发挥空间,比较典型的可以参考AJAXSLT ajaxslt 是一个针对Ajax在取得XML资料格式后,利用Javascript动态加入XSL-T(XML Stylesheet Language - Transformation)与及XPath的运用所开发的一套元件。一般上,XMLHttpRequest在传回XML字串后,我们必须花另一个功夫将这些XML数据转换成能够显示的用户界面,这是非常繁琐的工作,而且程序码的重用是一个恶梦。不过,通过ajaxslt,我们可以利用XSLT模版对 XML文件进行处理,然后输出一个用户界面,当然我们不必了解ajaxslt是怎样处理XML和XSLT的,只要熟悉XSLT和XPath的原理就可以很轻松地处理XML文件了。详细请看:http://nixeon.blogspot.com/2006/01/google-ajaxslt.html 8.一个xslt可以生成N种版面布局,但html就只能通过script来实现. 2.語法學習需要時間,大部分程序員可以對它比較陌生;但是語法非常直觀,只要稍微投入,就可以輕鬆入門. 3.xslt格式检查严谨,这在coding阶段也许稍微麻烦一点,但在应用和维护阶段非常有好处. 另外給大家推薦一個學習XML的論壇.http://bbs.xml.org.cn/index.asp 關於目前XML涉及到的一些新應用,比如:MathML,SVG,SMIL,VoiceXML,XSL-FO...可以看看:http://www.simonstl.com/articles/navigateur/index.html 转 XSL是参考SGML中的DSSSL(用来设置SGML的表现样式)而设计的。最初设计XSL的目的就是采用XML格式提供一种为XML文档设置表现样式的新方法。虽然也可以使用CSS来为XML文档设置表现样式(而且CSS还是非常成熟的一套规范,拥有大量的优点),但是CSS所采用的是与XML不同的一套语法,无法使用相同的XML解析器来进行处理,这为开发带来了额外的负担。后来W3C发现制定XSL规范的工作量实在太大,就将整个工作分成了两个部分:XSLT(T代表Transform)和XSL-FO(FO代表Formatting Objects)。XSLT主要是面向转换类应用,很快(1999年内)就作为正式规范推出了,参见 W3C XSLT 1.0规范;XSL-FO主要是面向精确的表现样式定义(例如生成PDF),在 W3C XSL 1.0规范中描述。所以,XSL=XSLT+XSL-FO。 XSLT虽然名字中也有Stylesheet,但是它其实不是为设置文档的表现样式的目的而设计的,用来替代CSS的是XSL-FO。然而XSL-FO目前还没有浏览器能够支持(其复杂性造成了其可能很多年以后才会被应用在浏览器之中,这是“委员会驱动”设计方法的通病),所以我们在这里就不讨论了。 XSLT的主要作用是将XML由一种格式转换为另一种格式,例如:由XML的一种词汇表转换为另一种词汇表;或者由XML转换为HTML或者XHTML,便于在浏览器中显示。后面一种应用(XML->HTML/XHTML)是目前XSLT应用最为广泛的领域,被应用在一些J2EE表现层框架中(例如,Cocoon是一个典型的代表。其他的J2EE表现层框架也可以通过集成Jakarta Taglibs来实现类似的功能)。这些框架在服务器端做XSLT转换,将生成的HTML/XHTML发送给浏览器。基于这种技术的框架可以非常方便地支持各种瘦客户端,例如:具有无线上网功能的PDA或WAP手机(这时候是XML->WML,也就是由XML的一种词汇表转换为另一种词汇表,WML 本身也是XML的一种词汇表),无非就是另外再写一套XSLT转换规则。有一些需要定期生成静态页面的网站也在服务器端采用XML+XSLT来定期生成静态页面(这类进程一般是以后台方式来运行的)。 在IE 5.0中就可以支持XSLT了,不过当时采用的不是XSLT的正式规范,而是这个规范的一个草案(namespace为http://www.w3.org/TR/WD-xsl)。IE 6.0支持XSLT的正式规范(namespace为http://www.w3.org/1999/XSL/Transform)。 Mozilla也在2001年就可以支持XSLT了。既然IE和基于Mozilla的浏览器(Mozilla Suite、Firefox、Netscape、etc.)都可以很好地支持XSLT,这就引起了一种思考,究竟是在服务器端做XSLT转换好还是在浏览器端做XSLT转换好呢?我的考虑是尽管在服务器端做XSLT转换更加灵活,功能更加强大,我却更愿意在浏览器端做转换。因为XSLT转换是非常耗费资源(内存、CPU)的操作,如果在服务器端做大量的转换操作必然会极大地影响服务器的性能(设想有100个并发连接,同时在服务器端做100个XSLT转换的情况)。必须要在服务器端做转换的更好的方案是以后台方式定期生成静态的HTML页面(一些新闻网站就是这样做的);或者在服务器端通过软件实现某种缓存机制,而不必重复做相同的转换。这也符合我们的一贯思路:浏览器其实能做很多事情,而且现在主流PC机型(P4 2G、256M 以上内存)的处理能力已经非常强了,所以在浏览器力所能及的情况下应该将尽量多的工作交给浏览器去做。 然而,目前除了IE与基于Mozilla的浏览器之外,其他的浏览器(例如Opera和Safari)目前仍然还不支持在浏览器端做XSLT转换,因此如果计划支持这些浏览器,必须要提供在服务器端做XSLT转换的对应功能,使得应用在这些浏览器上也能正常运行。 XSLT目前已经达到了实用的阶段并且被广泛采用。我们做Ajax开发有的时候也会用到XSLT。Google Maps的那个可爱的弹出式小气球就是使用客户端的XSLT(至少在IE和Firefox上是这样做的)来生成的。在《Ajax实战》(Ajax in Action中文版)第12章:使用XSLT的动态搜索,也通过一个完整的实例演示了客户端XSLT的威力。使用XSLT的好处是可以将很多界面生成的工作自动化,减少错误的发生。当然XSLT也有一定的复杂性,需要花一些时间来学习,带来了额外的学习成本,因此需要在做设计之前做一些权衡。在适当的场合使用XSLT,无疑会成为Ajax开发者的一件利器。 虽然XSLT在IE与基于Mozilla的浏览器中都可以支持XSLT,然而它们的调用语法差别很大,这又为我们带来了头疼的跨浏览器不兼容问题。不必担心,解决之道就是使用一些成熟的跨浏览器库,例如 Sarissa。Google支持的一个开源项目 Google AjaxSLT,代码基于Google的工作,用来执行XSLT转换,以及XPath查询. html/jsp/php时必须按页面顺序写的(除非用script对innerhtml处理可以例外) xslt完全不需要按顺序,把全站广告都放在一起,全站菜单放在一起,这是充分利用xsl:template的结果. 缺點: 1.兼容性問題: 部分瀏覽器不支持XSLT,不過解決方案可以將解析放在服務器端執行; -------------------------------------------------------------------------------------------------------------------------------- 转 Google Ajaxslt简介 ajaxslt是Google的一项开源项目,也是Google本身在Gmail, Google Maps, Google Suggest等Ajax应用程序的XML/XSLT/XPath处理元件。ajaxslt的功能很强,不过坏消息是,目前由于Google并没有对用户提供ajaxslt的说明书,所以新用户在探索ajaxslt的使用方法时是非常吃力不讨好的。 ajaxslt是一个针对Ajax在取得XML资料格式后,利用Javascript动态加入XSL-T(XML Stylesheet Language - Transformation)与及XPath的运用所开发的一套元件。一般上,XMLHttpRequest在传回XML字串后,我们必须花另一个功夫将这些XML数据转换成能够显示的用户界面,这是非常繁琐的工作,而且程序码的重用是一个恶梦。不过,通过ajaxslt,我们可以利用XSLT模版对XML文件进行处理,然后输出一个用户界面,当然我们不必了解ajaxslt是怎样处理XML和XSLT的,只要熟悉XSLT和XPath的原理就可以很轻松地处理XML文件了。 基于Google Maps的工作,Google AJAXSLT是使用XPath的XSL转换(XSLT)的JavaScript实现。XSLT可以把XML文档转换为其他语言,如HTML。AJAXSLT允许使用JavaScript在浏览器上直接完成这些转换。 Google AJAXSLT在所有主要浏览器上都能工作,它是在BSD许可证下发布的。这个工具包很小,包括几个JavaScript文件,还有一些方便的测试页。 Google AJAXSLT不是十全十美的,不过,如果Google Suggest有所提示,我们希望Google AJAXSLT的缺点能很快解决。因为Google是最先使用Ajax的网站之一,我们会很有兴致地看到在未来几个月它还会有所增加。更多有关的信息请访问goog-ajaxslt.sourceforge.net。 •开发语言: JavaScript •操作系统: 跨平台 •软件主页: http://code.google.com/p/google-axsjax/ •文档地址: •下载地址: http://sourceforge.net/project/platformdownload.php?group_id=140999 使用Ajaxslt 先去下载google ajaxslt的源码包 1、用xmlhttprequest从服务器获得xml数据放于id="xml"的div中 也可以从各种封装的xmlhttprequest框架中直接获得xml,这种方式更好一些 2、对应xsl放置于id="xslt"的div中 3、通过Ajaxslt组合成html,结果将显示于id="htmldisplay"的div中 加载如下js 然后 var xml = xmlParse(el('xml').value); var xslt = xmlParse(el('xslt').value); var html = xsltProcess(xml, xslt); document.getElementById('html').value = html; document.getElementById('htmldisplay').innerHTML = html; 很简单就完成了xml到html的转化,而xpath/xsl的强大功能使得我们可以非常更方面的处理xml数据 备注: misc.js:一些常量定义和 helper 函数,还有 log 的实现。 dom.js:XML DOM 接口的 JS 实现,主要的函数是 xmlParse( XMLString ),调用成功后就可以用标准 DOM 方式来操控返回的 XDocument 了。 xpath.js:XPath 的 JS 实现。 xslt.js:XSLT 的 JS 实现,要用到里面的 xsltProcess( XML, XSLT ),给定 XML 和 XSLT 得到转换的结果。