1 XML和XSL簡(jiǎn)介
1.1 XML
XML是可擴(kuò)展標(biāo)記語(yǔ)言(EXtensible Markup Language)的縮寫,它被設(shè)計(jì)用來(lái)傳輸和存儲(chǔ)數(shù)據(jù),并于1998年2月成為W3C的推薦標(biāo)準(zhǔn)。
更為專業(yè)的描述是這樣的:在轉(zhuǎn)換的過(guò)程中,XSLT用Xpath來(lái)定義源文檔中與一個(gè)或多個(gè)預(yù)先確定的模板相匹配的部分。當(dāng)找到了一個(gè)匹配時(shí),XSLT就將源文檔中的匹配部分轉(zhuǎn)換成結(jié)果文檔;而源文檔中不與任何一個(gè)模板匹配的部分最終在結(jié)果中保持不變。(摘自developerWorks)
2.1 結(jié)構(gòu)示例
這里使用DNF的一個(gè)專題舉個(gè)例子。此專題的訪問(wèn)地址是:http://dnf.qq.com/act/a20090710wcg/
這是一個(gè)趕工的專題,頁(yè)面代碼沒太多的參考性,只是拿出來(lái)做個(gè)示例,并且由于專題比較簡(jiǎn)單,XSLT文檔只用到了部分XSLT語(yǔ)句,屬于簡(jiǎn)單應(yīng)用。首頁(yè)使用的是HTML,因?yàn)閄ML不在默認(rèn)首頁(yè)文件格式之列,因此只有二級(jí)頁(yè)采用了XML+XSLT結(jié)構(gòu)。對(duì)于其中“代表隊(duì)介紹”這個(gè)二級(jí)頁(yè)面:
XML文檔:http://dnf.qq.com/act/a20090710wcg/players.xml
XSLT文檔:http://dnf.qq.com/act/a20090710wcg/xslt/player.xsl,http://dnf.qq.com/act/a20090710wcg/xslt/commens.xsl
XML和XSLT是樹狀結(jié)構(gòu)的,在瀏覽器中可以看到。XSLT文檔中,以”<xsl:”開頭的就是XSLT語(yǔ)句,”select”屬性里的內(nèi)容則是Xpath表達(dá)式(Xpath表達(dá)式不只存在于select屬性里),可以看到里面也包含了許多HTML代碼。XML和XSLT代碼是強(qiáng)制要求閉合。
其中player.xml文檔調(diào)用了player.xsl文檔,XML文檔不做解釋了。簡(jiǎn)述一下XSLT的文檔結(jié)構(gòu)含義。
文檔第一排是一條XML聲明語(yǔ)句;第二行stylesheet語(yǔ)句聲明XSLT版本和命名空間,所有的其他XSLT語(yǔ)句都必須包含在此語(yǔ)句內(nèi);第三行是import語(yǔ)句,調(diào)用具有公共模塊的文檔commens.xsl(commens.xsl文檔包括頂部白色banner條,頁(yè)面header塊,導(dǎo)航,腳部聲明四個(gè)模塊);第四行是output語(yǔ)句,表明將XML文檔轉(zhuǎn)換為HTML文件并輸出;然后通過(guò)template語(yǔ)句建立根模塊。緊接著的就是HTML代碼了,<body>標(biāo)簽后是一個(gè)call-template語(yǔ)句,調(diào)用頂部白色banner條。HTML代碼就不再解釋了。接著的XSLT代碼是兩個(gè)call-template語(yǔ)句,調(diào)用HTML頁(yè)面header塊和導(dǎo)航模塊。跟著是兩個(gè)for-each語(yǔ)句循環(huán)相同的結(jié)構(gòu),并通過(guò)Xpath選取XML數(shù)據(jù),一個(gè)循環(huán)用于生成“個(gè)人賽”資料,另一個(gè)用于生成“團(tuán)隊(duì)賽”資料,中間有很多value-of語(yǔ)句,用于調(diào)用XML相應(yīng)節(jié)點(diǎn)的值。接著是call-template語(yǔ)句,調(diào)用腳部聲明模塊,最后是頁(yè)面的一些標(biāo)簽閉合。
3 XML+XSLT結(jié)構(gòu)的優(yōu)勢(shì)
3.1 數(shù)據(jù)交換
XML本身是用于網(wǎng)絡(luò)上數(shù)據(jù)交換的語(yǔ)言,我可以調(diào)用互聯(lián)網(wǎng)里的其他XML文件(當(dāng)然,要經(jīng)過(guò)作者同意),通過(guò)編寫XSLT或者其他語(yǔ)言腳本(如ActionScript、JavaScript等),變成自己作品上的內(nèi)容。
XML 是獨(dú)立于軟件和硬件的信息傳輸工具,它的簡(jiǎn)單使其易于在任何應(yīng)用程序中讀寫數(shù)據(jù)。我們?cè)谑褂肵SLT轉(zhuǎn)換XML為HTML的同時(shí),此XML文檔還可以被其他各種腳本或開發(fā)語(yǔ)言調(diào)用。
3.2 代碼大小
XSLT有個(gè)很大的優(yōu)點(diǎn)是模塊化,如同JavaScript里的function一樣,需要時(shí)調(diào)用,同時(shí)也可以傳遞參數(shù)。這樣,網(wǎng)站各個(gè)頁(yè)面所具有的相同部分(比如導(dǎo)航,版權(quán)聲明等,甚至可以是HTML里的<head>標(biāo)簽)就可以單獨(dú)提出來(lái),封裝在一個(gè)模塊內(nèi),每個(gè)頁(yè)面的這個(gè)部分就可以替換為一條調(diào)用對(duì)應(yīng)模塊的代碼。
XSLT同時(shí)擁有循環(huán)語(yǔ)句,可以對(duì)代碼里相同的結(jié)構(gòu)進(jìn)行循環(huán)(比如li、tr等),同時(shí)遍歷應(yīng)用這個(gè)結(jié)構(gòu)的XML數(shù)據(jù),避免了因擁有相同結(jié)構(gòu)的數(shù)據(jù)而重復(fù)編寫代碼。
XSLT文檔可以相互調(diào)用,延長(zhǎng)了文檔的使用壽命,你可以調(diào)用以前寫過(guò)的XSLT來(lái)使用里面的模塊,不用再次編寫,你甚至可以調(diào)用別人寫過(guò)并發(fā)布在互聯(lián)網(wǎng)上的文檔(只要作者同意),這樣在一定程度上節(jié)約了精力和成本。
XML+XSLT結(jié)構(gòu)大大減少了代碼大小,并且隨著XML數(shù)據(jù)量和頁(yè)面數(shù)量的增加而越發(fā)明顯。當(dāng)然,數(shù)據(jù)量大過(guò)頭對(duì)XML不是什么好事。
3.3 代碼維護(hù)
利用XSLT的模塊功能,對(duì)于頁(yè)面相同部分的修改變得很簡(jiǎn)單,不用像以前一樣打開N個(gè)文件批量替換,我們只需要對(duì)XSLT文件的模塊代碼進(jìn)行修改。雖然也可以利用JavaScript編寫各個(gè)頁(yè)面的相同部分,然后調(diào)用,但代碼的可讀性遠(yuǎn)遠(yuǎn)比不上XSLT的模塊來(lái)得直接。
利用XSLT的循環(huán)代碼,修改數(shù)據(jù)的結(jié)構(gòu)不再變得痛苦。想象當(dāng)你要把一個(gè)龐大的table結(jié)構(gòu)的數(shù)據(jù)變成li結(jié)構(gòu)時(shí),批量替換已無(wú)法滿足要求。如果使用XSLT文檔,并利用循環(huán)代碼,你只需要修改一個(gè)循環(huán)的公共結(jié)構(gòu)就OK了。
3.4 節(jié)約訪問(wèn)資源
對(duì)于現(xiàn)在騰訊的游戲官網(wǎng),比如首頁(yè)的各種新聞列表,是使用JavaScript調(diào)用的,即服務(wù)器接到請(qǐng)求后,再開始從數(shù)據(jù)庫(kù)里查找新聞,然后返回。
我們其實(shí)可以換一種方式,即后臺(tái)事先根據(jù)頁(yè)面需要生成XML文檔,并保持每隔一個(gè)固定時(shí)間更新一次XML文檔,然后使用XSLT輸出頁(yè)面,這樣就在一定程度上節(jié)省了頁(yè)面下載時(shí)間。
同時(shí),由于后臺(tái)直接生成XML文檔,不再因?yàn)镹個(gè)新聞列表而向服務(wù)器發(fā)送N個(gè)請(qǐng)求,減少了頁(yè)面的請(qǐng)求數(shù)。
4 使用XML+XSLT結(jié)構(gòu)的可能性
4.1 瀏覽器支持
幾乎所有主要的瀏覽器均支持 XML + XSLT結(jié)構(gòu)的頁(yè)面。Firefox從1.0.2開始支持XML和XSLT;Netscape從8.0開始支持XML和XSLT;Opera從9.0開始支持XML和XSLT;IE從6.0開始支持 XML、XSLT和Xpath(資料來(lái)源于W3School)。
當(dāng)然還有Safari和Chrome,貌似這兩個(gè)瀏覽器是支持的(至少我安裝的這兩個(gè)瀏覽器沒發(fā)現(xiàn)啥問(wèn)題)。
4.2 編寫難度
相對(duì)于HTML的編寫,XML+XSLT的過(guò)程要復(fù)雜一些。畢竟要先寫好XML、HTML、CSS和JavaScript文檔,然后再在HTML文檔的基礎(chǔ)上編寫XSLT文檔,多個(gè)頁(yè)面還需要根據(jù)文檔進(jìn)行模塊提取,以便各文檔調(diào)用。
從整個(gè)過(guò)程來(lái)看,確實(shí)復(fù)雜一些,但這個(gè)復(fù)雜也是“先苦后甜”的寫照。完成XSLT文檔后,可以節(jié)省很多資源,也對(duì)以后的維護(hù)有很大的好處。
4.3 后臺(tái)開發(fā)
需要程序員將數(shù)據(jù)庫(kù)里的數(shù)據(jù)按頁(yè)面需要導(dǎo)出為相應(yīng)的XML文件,或者直接使用XML存儲(chǔ)數(shù)據(jù)(但比如新聞之類的信息數(shù)量很龐大,使用XML直接存儲(chǔ)數(shù)據(jù)會(huì)降低效率)。各種開發(fā)語(yǔ)言都能將數(shù)據(jù)庫(kù)中的數(shù)據(jù)輸出為XML文檔,相信難度不大。
4.4 競(jìng)爭(zhēng)
XSLT當(dāng)然不是唯一能轉(zhuǎn)換XML文檔的方式,其他語(yǔ)言腳本也可以實(shí)現(xiàn)與XSLT相同的功能。但是,其他語(yǔ)言腳本的使用遠(yuǎn)不及XSLT來(lái)的直接。XSLT可以直接使用HTML元素,并且可以使用Xpath很直觀的選取XML文檔節(jié)點(diǎn)。而且在XML+XSLT結(jié)構(gòu)中,XML文檔的調(diào)用很方便,只需在XML文檔里寫一條xml-stylesheet調(diào)用語(yǔ)句。
4.5 SEO
這可能是XML+XSLT結(jié)構(gòu)最郁悶的地方了,網(wǎng)上貌似還沒有使用此結(jié)構(gòu)替換HTML對(duì)于SEO影響的定論。但各種跡象表明,使用XML+XSLT結(jié)構(gòu)會(huì)在一定程度上對(duì)SEO造成不良的影響。
4.6 適用性偏向
由于XML本身是作為描述和傳輸信息的文檔,注定了XML+XSLT結(jié)構(gòu)更適合于信息展示類的頁(yè)面,比如新聞,相冊(cè)等,所以游戲官網(wǎng)很適合使用此結(jié)構(gòu)來(lái)完成。而功能性較多的頁(yè)面就不適合使用此結(jié)構(gòu),比如注冊(cè),發(fā)布系統(tǒng)等。
暴雪公司的所有游戲官網(wǎng)均采用XML+XSLT結(jié)構(gòu)。
星際爭(zhēng)霸2:http://www.starcraft2.com/
魔獸世界:http://www.worldofwarcraft.com/
暗黑破壞神3:http://www.blizzard.com/diablo3/
5 綜上所述
XML+XSLT結(jié)構(gòu)目前并不流行,雖然XML已廣泛應(yīng)用,但XSL由于各種原因并未能普及。對(duì)于騰訊的游戲官網(wǎng)建設(shè),由于首頁(yè)的各類信息調(diào)用涉及到很多產(chǎn)品或系統(tǒng)的接口,而廣告和新聞也是還是使用JavaScript調(diào)用的方式生成,XML+XSLT結(jié)構(gòu)的全面應(yīng)用在短期來(lái)看是不大可能的,目前也只有用于純靜態(tài)的圖片視頻展示,資料站等。XML+XSLT結(jié)構(gòu)的普及任重而道遠(yuǎn)。
才疏學(xué)淺,個(gè)人愚見,僅供褻玩。
更多信息請(qǐng)查看IT技術(shù)專欄