上期我們講到用CSS(層疊樣式表)來格式化XML文檔,其效果并不很令人滿意。實(shí)際上CSS用來格式化HTML標(biāo)記比較合適些,只是因?yàn)樗?jiǎn)單才在上例中采用。
XML在更多的時(shí)候只是一種數(shù)據(jù)文件,怎樣將它變?yōu)槲覀內(nèi)粘K吹降腍TML格式那樣的文件呢?如果我們將XML文件比作結(jié)構(gòu)化的原料的話,那么XSL就好像"篩子"與"模子",篩子選取自己需要的原料,這些原料再通過模子形成最終的產(chǎn)品:HTML。
這個(gè)模子大致是這樣:我們先設(shè)計(jì)好表現(xiàn)的頁(yè)面,再將其中需要從XML中獲取數(shù)據(jù)來填充內(nèi)容的部分"挖掉",然后用XSL語句從XML中篩出相關(guān)的數(shù)據(jù)來填充。一言以譬之:這XSL實(shí)際上就是HTML的一個(gè)"殼子",XML數(shù)據(jù)利用這個(gè)"殼"來生成"傳統(tǒng)"的HTML。
XML在展開時(shí)是一個(gè)樹形結(jié)構(gòu),我們將樹形結(jié)構(gòu)中自定義標(biāo)記稱為節(jié)點(diǎn),節(jié)點(diǎn)之間存在父子、兄弟關(guān)系,我們要訪問其中的結(jié)點(diǎn)從根結(jié)點(diǎn)就要以"/"來層層進(jìn)入。
在XSL這個(gè)殼中,我們要從原料庫(kù)XML里提取相關(guān)的數(shù)據(jù),就要用到XSL提供的模式化查詢語言。所謂模式化查詢語言,就是通過相關(guān)的模式匹配規(guī)則表達(dá)式從XML里提取數(shù)據(jù)的特定語句,即我們上面所說的"篩子"。
參考微軟的"XSL開發(fā)者指南",我們大致可將模式語言分為三種:
選擇模式:
<xsl:for-each>、<xsl:value-of>和 <xsl:apply-templates>
測(cè)試模式:
<xsl:if> 和<xsl:when>
匹配模式:
<xsl:template>
我們現(xiàn)在就分別對(duì)之進(jìn)行介紹。
一、 選擇模式
選擇模式語句將數(shù)據(jù)從XML中提取出來,是一種簡(jiǎn)單獲得數(shù)據(jù)的方法,這幾個(gè)標(biāo)記都有一個(gè)select屬性,選取XML中特定的結(jié)點(diǎn)名的數(shù)據(jù)。
1、<xsl:for-each>
如在XML中有這樣的數(shù)據(jù):
<author> <name>小禹</name> <name>春華</name> <name>秋實(shí)</name> </author>
我們要讀取這三個(gè)作者名字,是一個(gè)一個(gè)地按"author/name"方法來讀取嗎,可有多個(gè)這樣的name呀?如果有一種程序性的語句來循環(huán)讀取有多好。
想得很對(duì),XSL提供了這樣的具有程序語言性質(zhì)的語句:<xsl:for-each>
用它讀取這三個(gè)作者名字的方法如下:
<xsl:for-each select="author/name"> …… </xsl:for-each>
select,顧名思義,選取,它可以選定XML中特定唯一的標(biāo)記,也可以選擇某一類相同的標(biāo)記,我們稱之為結(jié)點(diǎn)集。
語法:
<xsl:for-each select="pattern" order-by="sort-criteria-list">
屬性:
1.select
根據(jù)XSL樣式查詢考察上下文以決定哪類結(jié)點(diǎn)集(滿足select條件)使用此樣式描述。作為一種簡(jiǎn)化的表示就是,如果你想對(duì)文檔中的某一種標(biāo)記的內(nèi)容的顯示方式進(jìn)行格式化,就可以將讓select等于此元素的標(biāo)記名。例如欲對(duì)標(biāo)記xml_mark進(jìn)行格式化,即可用如下方式表示:
<xsl:for-each select="xml_mark"> <!--樣式定義--> </xsl:for-each>
2.order-by
以分號(hào)(;)分隔、作為排序標(biāo)準(zhǔn)的列表。在列表元素前添加加號(hào)(+)表示按此標(biāo)記的內(nèi)容以升序排序,添加減號(hào)(-)表示逆序排序。作為一種簡(jiǎn)化的表示就是,排序標(biāo)準(zhǔn)列表就是由select規(guī)定的標(biāo)記的子標(biāo)記的序列,每個(gè)標(biāo)記之間以(;)分隔。
2、<xsl:value-of>
<xsl:for-each>模式只是選取節(jié)點(diǎn),并沒有取出節(jié)點(diǎn)的值,好比猴子只是爬到了樹的某個(gè)枝干上,那么就用< xsl:value-of >來摘"勝利果實(shí)"吧!
語法:
<xsl:value-of select="pattern">提取節(jié)點(diǎn)的值
屬性:
select用來與當(dāng)前上下文匹配的XSL式樣。簡(jiǎn)單的講,如果要在XSL文檔某處插入某個(gè)XML標(biāo)記(假定是xml_mark標(biāo)記)的內(nèi)容,可用如下方式表示:
<xsl:value-of select="xml_mark"></xsl:value-of>
或
<xsl:value-of select="xml_mark"/>
示例:
此處仍以上期的個(gè)人簡(jiǎn)歷的作為例子,我們需要對(duì)文件(個(gè)人簡(jiǎn)歷.xml)作一定修改,確切的說是將其中的第二行:
<?xml-stylesheet type="text/css" href="resume.css"?>
修改為:
<?xml-stylesheet type="text/xsl" href="resume.xsl"?>
然后建立一個(gè)新文件:resume.xsl,其內(nèi)容如下:
<?xml version="1.0" encoding="GB2312"?> <HTML xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <HEAD> <TITLE>個(gè)人簡(jiǎn)歷</TITLE> </HEAD><BODY> <xsl:for-each select="resume"> <P/> <TABLE border="1" cellspacing="0"> <CAPTION style="font-size: 150%; font-weight: bold"> 個(gè)人簡(jiǎn)歷 </CAPTION> <TR> <TH>姓名</TH><TD><xsl:value-of select="name"/></TD> <TH>性別</TH><TD><xsl:value-of select="sex"/></TD> <TH>生日</TH><TD><xsl:value-of select="birthday"/></TD> </TR> <TR> <TH>技能</TH><TD colspan="5"><xsl:value-of select="skill"/></TD> </TR> </TABLE> </xsl:for-each> </BODY> </HTML>
上例在瀏覽器中的樣子(IE5.0或更新版本) 完成這些以后再來讓我們看一下辛勤勞動(dòng)的成果,怎么樣?效果不錯(cuò)吧。更酷還在后頭呢,F(xiàn)在我們對(duì)文件(個(gè)人簡(jiǎn)歷.xml)作進(jìn)一步的修改:
1.在標(biāo)記<resume>前添加一個(gè)新標(biāo)記<document>;
2.將標(biāo)記對(duì)<resume></resume>之間的內(nèi)容(包括這一對(duì)標(biāo)記)復(fù)制并粘貼在其后,并在最后用<document>結(jié)束。
3.以Notepad.exe打開文件resume.xsl,在標(biāo)記<HTML>之后添加文字:<xsl:for-each select="document">;在標(biāo)記</HTML>之前添加文字:</xsl:for-each>,保存文件。
4.在瀏覽器中打開文件(個(gè)人簡(jiǎn)歷.xml)。看到了什么??jī)煞輦(gè)人簡(jiǎn)歷!
上例在瀏覽器中的樣子(IE5.0或更新版本) 就這樣,利用XML我們可以編寫內(nèi)容與樣式完成分離的文檔!當(dāng)然,XSL文件比一般的HTML文件要復(fù)雜一些,然而一旦完成則可用于格式化所有同類的XML文檔。
出處:CSDN
責(zé)任編輯:panliu888
上一頁(yè) 第一個(gè)XML文檔 下一頁(yè) XSL模板與匹配模式
◎進(jìn)入論壇網(wǎng)頁(yè)制作、網(wǎng)站綜合版塊參加討論
|