XML簡(jiǎn)明教程 一、XML的背景和應(yīng)用前景
(一)起源 XML(eXtended Markup Language)是從SGML(Standard Generalized Markup Language)進(jìn)化來的,最初SGML是為了解決文 檔及其格式問題的一種標(biāo)記語言,所以非常的復(fù)雜和難以使用,那時(shí)計(jì)算機(jī)的應(yīng)用水平還處在很低的階段,并且那時(shí)人們只需要傳遞 和顯示一些簡(jiǎn)單的數(shù)據(jù)。因此,89年Tim Berners-lee依據(jù)SGML開發(fā)出一種超文本格式,就叫HTML(HyperText Markup Language), 非常的簡(jiǎn)單。當(dāng)計(jì)算機(jī)的應(yīng)用水平也大幅度的提高的時(shí)候,人們已經(jīng)對(duì)太簡(jiǎn)單的HTML開始不滿意,因此又開始對(duì)其進(jìn)行修改、升級(jí), 就這樣HTML從1.0一直升到4.0的版本,擴(kuò)展了許多的命令,實(shí)際上也是為了讓HTML解決更多的問題,但是因?yàn)镠TML本身的缺陷,為了 解決更多的問題,是不是會(huì)把簡(jiǎn)單的HTML變成一個(gè)非常復(fù)雜的,難以理解的語言,就連現(xiàn)在看一個(gè)HTML的源文件,都會(huì)頭大好幾圈, 再加上HTML是把數(shù)據(jù)和顯示格式一起存放的,如果我們只想使用數(shù)據(jù)而不需要格式,可以想象,分離這些數(shù)據(jù)和格式是多么的困難。 而隨著Internet的發(fā)展, 98年1月W3C公布了XML1.0版本,立即成為計(jì)算機(jī)史上一個(gè)重要的里程碑。 XML包括XML元數(shù)據(jù)文件、Schema文件、XSLT顯示文件、XLL鏈接、Xpath等一系列相關(guān)部分,但是對(duì)于不是計(jì)算機(jī)方面的專業(yè) 人士來講,最好只看它的元數(shù)據(jù)文件,而把別的問題交給開發(fā)和制作人員,這樣就可以讓非專業(yè)人士脫離看懂那些頭疼的術(shù)語的痛苦 。在此就先說說XML的特點(diǎn): 1. 電子數(shù)據(jù)交換(EDI) 2. 靈活的開發(fā) 因?yàn)閄ML是數(shù)據(jù)和格式分離設(shè)計(jì)的,所以XML元數(shù)據(jù)文件就是純數(shù)據(jù)的文件,這樣就可以使用同一個(gè)數(shù)據(jù)源,顯示多種樣式了 。而使用HTML的話,每顯示一種式樣,就必須重新把數(shù)據(jù)和格式混到一起,這是一件很痛苦的事情。 XML采用的TAG是自己定義的,這樣我們的數(shù)據(jù)文件的可讀性就能大大提高,也不再局限于HTML文件那些標(biāo)準(zhǔn)的TAG了。而且因 為XML支持Unicode,所以我們就可以使用中文標(biāo)記(TAG),是不是感覺很自由呢?看看這樣一個(gè)存放職員數(shù)據(jù)的XML數(shù)據(jù)文件: <職員> <姓名>于青</姓名> <性別>女</性別> <年齡>23</年齡> <學(xué)歷></學(xué)歷> <教育經(jīng)歷> <畢業(yè)學(xué)校>北京大學(xué)</畢業(yè)學(xué)校> <入學(xué)時(shí)間>1996-09-01</入學(xué)時(shí)間> <畢業(yè)時(shí)間>2001-07-01</畢業(yè)時(shí)間> <專業(yè)>中文</專業(yè)> </教育經(jīng)歷> </職員> 看到這個(gè)文件感覺是不是很棒?這樣的文件不需要使用很復(fù)雜和專業(yè)的工具就可以增加、修改和編輯(使用微軟的記事本就可以 做到這些),而且大部分人都可以使用,可以讓一個(gè)非計(jì)算機(jī)的專業(yè)人士,在10分鐘內(nèi)學(xué)會(huì),這就是一個(gè)XML元數(shù)據(jù)文件的樣子。當(dāng)然 XML文件也不象HTML那樣可以寫的不完整,XML必須寫的中規(guī)中矩(well formed),否則XML的解析器就會(huì)報(bào)錯(cuò)。 3. 面向?qū)ο蟮奶匦?/p> XML的文件是以樹狀方式存儲(chǔ),同時(shí)也有屬性,這非常符合面向?qū)ο蠓矫娴木幊?,而且也體現(xiàn)了以對(duì)象方式存儲(chǔ),ORACLE數(shù)據(jù) 庫(kù)就使用了這種面向?qū)ο蟮奶匦裕荗RACLE數(shù)據(jù)庫(kù)的根本是關(guān)系型的數(shù)據(jù)庫(kù),因此速度和穩(wěn)定性都有一定的問題,而且特別的復(fù)雜 ,所以大家基本上是很少使用它的這一特性,深怕跳到坑里去! 4. 缺陷 世界上永遠(yuǎn)也不會(huì)出現(xiàn)完美的語言的,XML也是一樣,它也有很多的缺陷,雖然它是樹狀存儲(chǔ)的,搜索的效率極高,但是問題 不是在搜索,而是在于目前它的插入和修改,!
#1 二、XML基礎(chǔ) (一)XML術(shù)語 在學(xué)習(xí)XML之前,我想先給大家介紹一些XML使用的術(shù)語。平常我們學(xué)習(xí)新的語言時(shí),總會(huì)遇到許多難以理解的術(shù)語,在這里 就先介紹一些主要的給大家。 元素(Elements):代表XML文檔中的每一個(gè)組件,包含字符、元素或者兩者皆有,允許有空元素(empty element)。 屬性(Attributes):放在元素后面的數(shù)據(jù),代表這個(gè)元素的另一種特性和特征。 統(tǒng)一編碼(Unicode):一種字符集,包括了全世界各種語言中有用的字符。 實(shí)體:“文本片”,實(shí)體也像一個(gè)縮寫,一個(gè)實(shí)體可以是一個(gè)字符也可以是一個(gè)文檔的數(shù)據(jù),是XML文本的基本單位。 標(biāo)記(Markup):像標(biāo)記(TAG)、實(shí)體引用(Entity reference)和聲明這樣的構(gòu)件。 樣式表(XSL):描述XML的元數(shù)據(jù)文件格式的語言(因?yàn)镃SS對(duì)于XML來講不夠用)。 序言(Prolog):關(guān)于文檔實(shí)例表現(xiàn)形式的信息。 文檔實(shí)例(Document instance):以元素的層次結(jié)構(gòu)組織的實(shí)際文檔數(shù)據(jù)。 (二)XML語法簡(jiǎn)介 1.看一個(gè)簡(jiǎn)單的例子 這是一個(gè)關(guān)于庫(kù)存物品清單的簡(jiǎn)單例子,大家可以從中發(fā)現(xiàn)XML的許多特性,并且可以體會(huì)到XML的元數(shù)據(jù)文件是非常清晰易 讀的: <!-XML文件示例--> <?xml version="1.0" encoding="GB2312" ?> <庫(kù)存清單> <!--這里就是注釋--> <庫(kù)存物品> <名稱>毛巾</名稱> <規(guī)格 單位="cm">25*50</規(guī)格> <生產(chǎn)廠家>中國(guó)棉紡廠</生產(chǎn)廠家> <生產(chǎn)日期>20010-09-01</生產(chǎn)日期> <數(shù)量 單位="條">400</數(shù)量> <進(jìn)貨價(jià) 單位="元">2.5</進(jìn)貨價(jià)> <零售價(jià) 單位="元">6.5</零售價(jià)> </庫(kù)存物品> <庫(kù)存物品> <名稱>碗</名稱> <規(guī)格 單位="cm">5*15</規(guī)格> <生產(chǎn)廠家>中國(guó)搪瓷廠</生產(chǎn)廠家> <生產(chǎn)日期>20010-09-11</生產(chǎn)日期> <數(shù)量 單位="個(gè)">200</數(shù)量> <進(jìn)貨價(jià) 單位="元">1.5</進(jìn)貨價(jià)> <零售價(jià) 單位="元">4.5</零售價(jià)> </庫(kù)存物品> <庫(kù)存物品> <名稱>筷子</名稱> <規(guī)格 單位="個(gè)">1*10</規(guī)格> <生產(chǎn)廠家>中國(guó)搪瓷廠</生產(chǎn)廠家> <生產(chǎn)日期>20010-09-11</生產(chǎn)日期> <數(shù)量 單位="把">200</數(shù)量> <進(jìn)貨價(jià) 單位="元">1.5</進(jìn)貨價(jià)> <零售價(jià) 單位="元">3.5</零售價(jià)> </庫(kù)存物品> </庫(kù)存清單>
看過了XML語言的基本格式,下面將詳細(xì)講解XML元數(shù)據(jù)文件的各個(gè)組成部分,實(shí)際就上面這些而言是非常簡(jiǎn)單的,當(dāng)然,我 們要想更清楚的了解和學(xué)習(xí)XML,就必須清楚地知道這些定義的意義。 2.聲明(Declaration) XML數(shù)據(jù)文件的定義不象HTML那樣自由,它是非常嚴(yán)格的,缺少一個(gè)就會(huì)出錯(cuò)!因?yàn)槊總€(gè)XML的解析器第一步要做的事情就是 檢查XML文件是否合格,就是“well-formed”,所以大家看到第一句是這樣些的: <?xml version="1.0" encoding="GB2312" ?> 注意的是:不能漏掉此句,否則解析器不予解析的!當(dāng)然里面的encoding可以不用寫,缺省是Unicode,在此對(duì)XML使用的字符編 碼作一下說明,大家都應(yīng)該知道中文和英文的區(qū)別吧,呵呵,有人說了,這也太簡(jiǎn)單了,實(shí)際上平時(shí)有區(qū)別就罷了,結(jié)果鬧到計(jì)算機(jī) 上真是比較麻煩,大家用過古董DOS的就知道使用漢字在計(jì)算機(jī)上是一件多么困難的事情,別人26個(gè)字母就可以搞定,漢字卻要好幾萬 個(gè)?,F(xiàn)在的計(jì)算機(jī)的發(fā)展雖然神速,可國(guó)際化的問題卻一直存在,況且不屬英語語系的國(guó)家也都有此類問題,因此美國(guó)的各大電腦廠 商組成了一個(gè)Unicode促進(jìn)會(huì),結(jié)合ISO的字庫(kù)標(biāo)準(zhǔn),推出了Unicode,這個(gè)編碼可以滿足絕大多數(shù)語系的需要! 3.元素(Elements)和屬性(Attributes) <元素名 屬性名=”屬性值”> <子元素>元素的數(shù)據(jù)</子元素> </元素名> 大家看上面的這個(gè)例子,就能很形象的理解什么是元素什么是屬性,但是需要注意的是元素的大小寫是不一樣的,也就是說< t></t>和<T></T>不是同一個(gè)元素。還有就是元素里的數(shù)據(jù),只要是合法的就會(huì)完全忠實(shí)的成為數(shù)據(jù),就如: <元素名>這是一個(gè)</元素名> <!-這是另一個(gè)--> <元素名>這是一個(gè) </元素名> <!-這又是另一個(gè)--> <元素名>這是一個(gè) </元素名> 大家注意到?jīng)]有,第一、二只差一個(gè)空格,第三個(gè)則是多了一個(gè)回車符,但是這三個(gè)數(shù)據(jù)卻是不同的數(shù)據(jù),因此大伙在寫這 些數(shù)據(jù)的時(shí)候可一定要小心! 如果大家對(duì)于面向?qū)ο笫煜さ脑挘欢ㄇ宄愐彩怯袑傩缘?,而XML自然也是包括屬性的,XML的元素是擁有屬性的,而且可 以有許多屬性,并且屬性值必須使用單引號(hào)或雙引號(hào)包含起來。 4.注釋(Comments) 如果大家編寫過程序,就一定知道,看別人的程序是一件非常痛苦的事情。如果別人的程序是沒有注釋的話,那簡(jiǎn)直就成了 一種慘無人道的折磨,呵呵,所以,在文檔中嵌入關(guān)于文檔和標(biāo)記的信息就是很有幫助的。這樣不但可以幫助別人也可以幫助自己。 在XML的注釋里是這樣的: <!-啊,這就是幫助--> 在這個(gè)注釋中間,可以放入除了“--”符號(hào)以外的所有字符,這稍稍有些不習(xí)慣,我們往往會(huì)使用這個(gè)符號(hào)來分離不同組成部分 的文檔,在XML的文件里則需要改一改了。 5.預(yù)定義實(shí)體 當(dāng)我們創(chuàng)建XML時(shí)候,有些符號(hào)例如“<”等和XML相重的標(biāo)記,譬如下面的: <文章> <段落> <html> <head> <title></title> </head> <body> <h1>我們那嘎都是活雷鋒</h1> <b>老張開車去東北……撞了</b> </body> </html> </段落> </文章> 這樣是肯定行不通的,HTML和XML的定義相重,因?yàn)閄ML有5種預(yù)定義的實(shí)體,如下: &-------------------& <----------------------< >--------------------- > '------------------‘ "------------------“ 這樣再寫這些文件就會(huì)象下面這樣: <文章> <段落> <html> <head> <title></title> </head> <body> <h1>我們那嘎都是活雷鋒</h1> <b>老張開車去東北……撞了</b> </body> </html> </段落> </文章> 解析器會(huì)自動(dòng)把這些符號(hào)轉(zhuǎn)換成我們所要的文件,但是這樣實(shí)在是不好看懂,所以就又有了這個(gè)CDATA。 6.CDATA 從上面那一節(jié)的例子可以看出,使用預(yù)定義實(shí)體實(shí)在是難以看懂,但是有了這個(gè)CDATA之后,我們就可以讓分析器把那些特殊 數(shù)據(jù)當(dāng)作普通的數(shù)據(jù)來處理了! CDATA的定義如下: <![CDATA[ 內(nèi)容 ]]> 將上節(jié)的例子拿來使用: <文章> <段落><![CDATA[ <html> <head> <title></title> </head> <body> <h1>我們那嘎都是活雷鋒</h1> <b>老張開車去東北……撞了</b> </body> </html> ]]> </段落> </文章> 這樣,解析器就可以解釋在這個(gè)符號(hào)中間的特殊字符了! #1 三、 CHEMA簡(jiǎn)介 (一) Schema的引入 通過上幾章介紹,相信大家對(duì)XML的基本語法已經(jīng)有了一個(gè)基本了解。 XML本身的語法很嚴(yán)謹(jǐn),也就是要求格式必須嚴(yán)整,包 括區(qū)分大小寫、整個(gè)文檔有且只有一個(gè)根、需要序言等等。在符合格式化良好的要求以后,就可以寫出規(guī)則整齊、可以通過內(nèi)置XML解 析器的瀏覽器解析XML文檔了。但XML本身也相當(dāng)?shù)撵`活,在符合基本語法的前提下,可以任意的編寫各種符合XML語法要求的文檔,這 也正是XML可擴(kuò)展的靈活性所在,但同時(shí)也產(chǎn)生了問題,比如要寫一個(gè)說明個(gè)人信息的XML文檔,可以這樣寫: <?xml version = “1.0” encoding=”GB2312” ?> <resume> <name>張立東</name> <sex>男</sex> <age>28</age> <birthday>1974-8-10</birthday> <address>北京市 海淀區(qū)</address> </resume> 也可以這么寫: <?xml version = “1.0” encoding=”GB2312”?> <resume> <name>張立東</name> <sex>男</sex> <age>28</age> <birthday> <year>1974</year> <month>8</month> <day>10</day> </birthday> <address>北京市 海淀區(qū)</address> </resume> 上面的兩個(gè)文檔對(duì)于人來說是很容易看懂的,但對(duì)于機(jī)器來說,它們就無法判斷 <birthday>1974-8-10</birthday>和 <birthday> <year>1974</year> <month>8</month> <day>10</day> </birthday> 中的內(nèi)容是否相同了。這就需要一個(gè)相應(yīng)的“約束”,來規(guī)定一個(gè)固定的格式,這樣機(jī)器才可以正確的識(shí)別、比較和處理。正如 沒有規(guī)矩難以成方圓一樣, XML這么強(qiáng)大的語言自然也有這方面的考慮,這也就是DTD和Schema所要完成的功能。 (二)DTD和Schema 提到Schema就必須提到DTD。最早建立對(duì)SGML約束的是DTD,而XML又是SGML的超集,所以DTD由于歷史的原因也可以對(duì)XML本身 進(jìn)行約束,比如:每個(gè)節(jié)點(diǎn)可以含有的元素、元素的個(gè)數(shù)等等。但它也有很多的局限性,如不能定義元素值的范圍、學(xué)習(xí)起來有一定 的難度(要學(xué)習(xí)一種新的語法)等等。而最新的XML約束標(biāo)準(zhǔn)就可以輕松的滿足要求,這就是Schema。Schema與DTD不同,DTD本身有自 己的語法和要求,而Schema是完全符合XML語法的,只要對(duì)XML有初步的了解,就很容易對(duì)Schema上手。說了這么多,還是首先讓我們 通過一個(gè)例子來看看Schema是如何定義XML結(jié)構(gòu)的吧: [1]<?xml version="1.0" encoding="GB2312" ?> [2]<Schema xmlns="urn:schemas-microsoft-com:xml-data" [3] xmlns:dt="urn:schemas-microsoft-com:datatypes"> [4] <ElementType name= "name"/> [5] <ElementType name= "sex"/> [6] <ElementType name= "age"/> [7] [8] <ElementType name= "address" /> [9] <ElementType name= "month"/> [10] <ElementType name= "year"/> [11] <ElementType name= "day"/> [12] <ElementType name= "birthday" content="eltOnly"> [13] <element type= "year" /> [14] <element type= "month" /> [15] <element type= "day" /> [16] </ElementType> [17] <ElementType name= "resume" content="eltOnly"> [18] <element type= "name" /> [19] <element type="sex"/> [20] <element type="age"/> [21] <element type="birthday"/> [22] <element type="address"/> [23] </ElementType> [24]</Schema> 下面對(duì)上面的例子做一個(gè)簡(jiǎn)單的講解: [1]行是一個(gè)XML序言,從這行也可以看出Schema是符合XML基本語法要求的。 [2]-[3]是對(duì)Schema名域的一個(gè)定義。(由于我們這里是一個(gè)XML的入門文章,有關(guān)XML的名域問題可以參考相應(yīng)的XML文檔。) [4]定義一個(gè)名字為name的元素。 [5]-[11]分別是對(duì)sex、age、address、month、year、day元素的定義。 [12]-[16]是對(duì)birthday元素的一個(gè)定義,但birthday這個(gè)元素比較特殊,它其中又包含了year、month和day三個(gè)元素。 其中content這個(gè)屬性是對(duì)元素中的數(shù)據(jù)進(jìn)行說明的。根據(jù)content中的數(shù)據(jù)eltOnly可以知道這個(gè)birthday元素的數(shù)據(jù)只能夠由元素構(gòu) 成。 [17]-[23]是對(duì)resume這個(gè)元素的定義,resume這個(gè)元素是由name、sex、age、birthday、address這幾個(gè)元素構(gòu)成的。 從上面的例子可以知道如何對(duì)一個(gè)簡(jiǎn)單的元素進(jìn)行定義,也可以知道一個(gè)由其他元素組成的元素如何定義。通過由元素組成的元 素的這種定義,就可以定義一個(gè)嵌套結(jié)構(gòu)的XML樹的基本結(jié)構(gòu)。 到這里讀者對(duì)Schema已經(jīng)就有了一個(gè)基本的了解,也該是我們給Schame下一個(gè)簡(jiǎn)單定義的時(shí)候了: XML Schema是用來描述XML元素和屬性的。它包括屬性和元素類型說明,是可以為XML元素和屬性提供數(shù)據(jù)的類型校驗(yàn)?zāi)K。 #1 四、xslt簡(jiǎn)介 了解XML的基本語法、Schema的語法還遠(yuǎn)遠(yuǎn)不夠,XML是對(duì)數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ),而Schema是對(duì)XML數(shù)據(jù)類型的定義。直到這 里還沒有對(duì)XML數(shù)據(jù)的顯示進(jìn)行處理。雖然可以通過內(nèi)置有XML解析器的瀏覽器直接對(duì)XML數(shù)據(jù)進(jìn)行查看,但畢竟看到的只是以樹狀結(jié)構(gòu) 顯示的XML數(shù)據(jù)。 如果要把XML數(shù)據(jù)以漂亮的形式顯示出來就需要XSLT幫忙了。XSLT可以把XML處理成HTML形式輸出、WAP形式輸出,甚至也可以 是Word文檔的格式。其中最常用到的還是HTML的格式,下面講解中用到的所有例子都以HTML的轉(zhuǎn)換格式為例子。那就不說廢話了,還 是先看一個(gè)XSLT的例子吧! 這個(gè)XSLT用到的一個(gè)XML文檔,文檔如下: <?xml version = "1.0" encoding="GB2312"?> <?xml:stylesheet type="text/xsl" href="s_xlt.xslt"?> <resumes> <resume> <name>張立東</name> <sex>男</sex> <age>28</age> <birthday> <year>1974</year> <month>8</month> <day>10</day> </birthday> <address>北京市 海淀區(qū)</address> </resume> <resume> <name>張三</name> <sex>男</sex> <age>50</age> <birthday> <year>1951</year> <month>6</month> <day>9</day> </birthday> <address>山西省</address> </resume> <resume> <name>李四</name> <sex>男</sex> <age>29</age> <birthday> <year>1973</year> <month>7</month> <day>12</day> </birthday> <address>山東省</address> </resume> </resumes> 注:在上面的XML文檔中多了下面的一句: <?xml:stylesheet type="text/xsl" href="s_xlt.xslt"?> 這一句就是對(duì)XSLT的引用,其中href中的內(nèi)容是對(duì)具體XSLT文檔位置的指定,有關(guān)s_xlt.xslt中的內(nèi)容就是下面要介紹的XSL T例子的內(nèi)容。有關(guān)如何對(duì)XML,XLST、Schema的使用和測(cè)試,可以參考“一個(gè)應(yīng)用了xml、schema和xlst的例子”部分。 對(duì)這個(gè)XML文檔進(jìn)行轉(zhuǎn)換處理的XSLT文檔如下: [1]<?xml version="1.0" encoding="GB2312"?> [2]<xsl:stylesheet version="1.0" xmlns:xsl="http://www./TR/WD-xsl"> [3] <xsl:template match="/"> [4] <HTML> [5] <HEAD> [6] <TITLE>個(gè)人簡(jiǎn)歷</TITLE> [7] </HEAD> [8] <BODY> [9] <xsl:for-each select="/resumes/resume"> [10] <P> [11] <TABLE border="1" > [12] <CAPTION style="font-size: 150%; font-weight: bold"> [13] 個(gè)人簡(jiǎn)歷 [14] </CAPTION> [15] <TR> [16] <TH>姓名</TH><TD><xsl:value-of select="name"/></TD> [17] <TH>性別</TH><TD><xsl:value-of select="sex"/></TD> [18] <TH>生日</TH><TD><xsl:value-of select="birthday/year"/>年 <xsl:value-of select="birthday/month"/>月<xsl:value-of select="birthday/day"/>日</TD> [19] </TR> [20] <TR> [21] <TH>地址</TH><TD colspan="5"><xsl:value-of select="address"/></TD> [22] </TR> [23] </TABLE> [24] </xsl:for-each> [25] </BODY> [26] </HTML> [27] </xsl:template> [28]</xsl:stylesheet> [1]XML的序言,從第一條語句可以看出XSLT也是符合XML語法的。 [2]XSLT的名域。Xsl:stylesheet是XSLT的根元素,xsl是XSLT的名域標(biāo)識(shí)。所以都要在XSLT的語句前面加上xsl:來表明是XSLT 的語句。 [3] <xsl:template match="/"> 是XSLT語言的匹配模式,主要是和引用它的XML文檔的根進(jìn)行匹配。其中/是代表XML文檔根的含 義。 例如:個(gè)人簡(jiǎn)介中的name可以用/resumes/resume/name 的方式進(jìn)行引用。(由于這里只是對(duì)XSLT入門的一個(gè)初步介紹,對(duì)有關(guān)XML路徑想詳細(xì)了解的讀者可以參考XML文檔的XPATH部分。) [4]-[8]可以直接輸出,這部分是符合HTML語法的信息結(jié)構(gòu),HTML文檔的開始部分和head的定義。 [9] <xsl:for-each select="/resumes/resume">是XSLT語言的選擇模式,是循環(huán)的對(duì)所有的/resumes/resume元素和這個(gè)元素所 包含的子元素進(jìn)行處理。 [10]-[15] 可以直接輸出,符合HTML的語法結(jié)構(gòu)。 [16] <TH>姓名</TH><TD><xsl:value-of select="name"/></TD> 在這一行中有HTML的語句和也有XSLT的語句。其中<xsl:value-of select="name"/>也是屬于選擇模式的語句,可以直接把select選中 的元素內(nèi)容提取處理,處理以后的結(jié)果應(yīng)該是:<TH>姓名</TH><TD>張立東</TD>。 [18]-[23]分別是對(duì)其他部分信息的顯示處理,其中也包含了部分的HTML語句。 [24] <xsl:for-each> 語句的結(jié)束部分。 [25]-[26]HTML語句。 [27] <xsl:template> 語句的結(jié)束部分。也就是對(duì)整個(gè)XML文檔處理的結(jié)束。因?yàn)槊總€(gè)XML文檔只有一個(gè)根而這條語句是對(duì)根的部 分處理,所以是對(duì)整個(gè)XML文檔處理的結(jié)束。 [28] XSLT文檔的結(jié)束。 經(jīng)上面對(duì)這個(gè)簡(jiǎn)單例子的介紹,大家對(duì)XSLT對(duì)XML文檔的處理可能已經(jīng)有了一個(gè)基本的了解,可以簡(jiǎn)單的通過XSLT對(duì)XML進(jìn)行 處理啦。在結(jié)束這個(gè)部分之前對(duì)XSLT的語法做一個(gè)簡(jiǎn)單的小結(jié): 可以大致的把模式語言分為三種: 選擇模式 <xsl:for-each>、<xsl:value-of>,和 <xsl:apply-templates> 測(cè)試模式 <xsl:if> 和<xsl:when> 匹配模式 <xsl:template> 選擇模式語句將數(shù)據(jù)從XML中提取出來,這是一種簡(jiǎn)單獲得數(shù)據(jù)的方法。這幾個(gè)標(biāo)記都有一個(gè)select屬性,選取XML中特定結(jié) 點(diǎn)名的數(shù)據(jù)。 測(cè)試模式是對(duì)數(shù)據(jù)的一個(gè)判斷,然后根據(jù)判斷和匹配的結(jié)果進(jìn)行處理。有些和程序語言中的判斷語句和多判斷語句形似。 匹配模式是一個(gè)可以單獨(dú)列出來的XSLT語句片斷,可以完成對(duì)一個(gè)特定部分的XSLT處理。有些和程序設(shè)計(jì)中的子程序相似。 #1 五、一個(gè)應(yīng)用了xml、schema和xlst的例子 通過上面的介紹,大家可能都已經(jīng)躍躍欲試,想自己做一個(gè)XML方面的小應(yīng)用了。那么在這里就滿足大家的要求,舉一個(gè)比較 全面的有實(shí)際意義的例子。 假如有一個(gè)訂單要處理,訂單的基本內(nèi)容包括客戶的信息和產(chǎn)品信息兩個(gè)部分。 客戶信息主要由客戶姓名、電話、傳真、地址組成。 產(chǎn)品信息由編號(hào)、名稱、規(guī)格、價(jià)格、購(gòu)買數(shù)量組成。 為了寫一個(gè)標(biāo)準(zhǔn)的XML文檔,首先要寫一個(gè)Schema來對(duì)XML文檔進(jìn)行約束: 下載該文件:
可以把上面的Schema文檔存儲(chǔ)為:Sch.xml,在下面的xml文檔中會(huì)用到這個(gè)Schema。 下面是根據(jù)上面的約束寫的一段XML文檔: 下載該文件:
下面是對(duì)XML進(jìn)行處理的S2_xls.xslt的內(nèi)容: 下載該文件:
把上面的Schema和XSLT按照例子中的名字存儲(chǔ)到磁盤,然后把XML的內(nèi)容存儲(chǔ)成為文件,放到相同的子目錄下,然后用IE 5.0 進(jìn)行解析處理,就會(huì)看到符合Schema要求、經(jīng)過XSLT處理的文檔了. #1 六、后記 以上只是簡(jiǎn)單介紹了XML的前端應(yīng)用部分,如果各位對(duì)XML的后臺(tái)開發(fā)還感興趣的話,就需要了解XML更加復(fù)雜的部分,也需要 知道XML的解析器是如何解析XML的。限于篇幅,只能給大家一個(gè)簡(jiǎn)單的介紹。 XML文件的解析器目前分為兩種: 一個(gè)是DOM(Document Object Model),一個(gè)是SAX。這兩個(gè)解析器都是可以解析XML的,但是在解析XML的方式上有很大的不 同,DOM是一次性的把XML文件讀入到內(nèi)存里解析,處理速度很快,而SAX則是一部分一部分的解析,所以資源占用較少,大伙了解了這 兩種特性后,就可以有選擇的使用解析器了。目前Microsoft和Java都支持這兩種解析器,因此大家可以放心的使用。 |
|