曝光臺 注意防騙
網(wǎng)曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費(fèi)者
9.4.2 循環(huán)
循環(huán)是我們在過程語言中經(jīng)常使用的命令。X S LT也支持循環(huán)命令,使用< x s l : f o r- e a c h . . . / >方
式。它的內(nèi)容被重復(fù)執(zhí)行直到最初X M L文檔中的元素符合指定的屬性。舉一個例子,我們能夠使
用f o r- e a c h命令把X M L書列表文檔轉(zhuǎn)換成表項在列表文檔中列出的X H T M L文檔。下面是一個
X S LT程序完整的清單,你將看到使用上的一些有趣的事情:
程序清單9 - 2 1
你可能注意到的第一件事情是它使用了與以往例子不同的格式。該程序僅僅包含了簡單的
第9章轉(zhuǎn)換XML使用335 下載
模板固定匹配根元素。事實上,在這個二選一的格式中包括< x s l : t e m p l a t e >這樣的命令是沒有必
要的。這個固定的模板是<xsl:template match=“/”>。
我們創(chuàng)建的表每個< I T E M >包含一行。在這個例子中,我們不能使用模板匹配機(jī)制,我們使
用f o r- e a c h命令循環(huán)始終貫穿程序,使用v a l u e - o f命令獲取元素內(nèi)容:
程序清單9 - 2 2
我們告訴處理器,“對根< B O O K L I S T >元素中的每一個< I T E M >元素,寫< T I T L E >、
< C AT E G O RY >、< R E L E A S E _ D AT E >和< P R I C E >元素的內(nèi)容進(jìn)入表中”。循環(huán)命令的標(biāo)準(zhǔn)是從根
開始的一個XPa t h表達(dá)式;因此,我們不得不顯式地包含在文檔樹的分支中每一個< I T E M >的元
素。當(dāng)不再有元素滿足條件時循環(huán)才能結(jié)束。
為了包含表單元格中的值,我們使用< x s l : v a l u e - o f . . . / >元素。與你所設(shè)想的一樣,它獲取了
匹配s e l e c t屬性的XPa t h表達(dá)式的節(jié)點的數(shù)據(jù)內(nèi)容。
結(jié)果輸出顯示在圖9 - 1 4中。
圖9-14
9.4.3 排序
在我們的數(shù)據(jù)列表中移動數(shù)據(jù),加入新的數(shù)據(jù),連接合成文檔到C S S樣式表,之后,讓我們
加入排序。目標(biāo)是先按照種類排序,再按照題目排序。
用到這個方法的X S L命令是< x s l : s o r t >。為了讓X S LT引擎排序,我們包括s e l e c t屬性設(shè)置到
XPa t h值。舉個例子,按題目排序,我們使用下面的命令:
問題是:我們怎么找到包含這種用法的例子。它是僅僅被使用在< x s l : a p p l y - t e m p l a t e s . . . / >或
336使用XML 高級編程
下載
者< x s l : f o r- e a c h . . . >元素中的一個指令元素,下面這個示例是對“循環(huán)”一節(jié)中示例的修改:
程序清單9 - 2 3
現(xiàn)在,< x s l : f o r- e a c h . . . >元素在怎樣處理被選擇的節(jié)點上采用了新的指令。引擎在用模板匹配
節(jié)點之前對它們進(jìn)行排序。在上面的例子中,節(jié)點首先按照種類排序,然后按照題目排序,像
圖9 - 1 5顯示的一樣。
圖9-15
排序的次序按照< x s l : s o r t . . . / >中指定的元素次序排列。舉個例子,下面的命令將替代
< T I T L E >和< R E L E A E _ D AT E >對節(jié)點排序。
第9章轉(zhuǎn)換XML使用337 下載
記住,< s o r t >命令在對節(jié)點進(jìn)行處理前,先對節(jié)點進(jìn)行重新排序(參見圖9 - 1 6)。
圖9-16
9.4.4 條件處理
在過程語言中經(jīng)常使用的另外一種命令是:
• if命令,在X S LT中以< x s l : i f >表示。
• if/elseif命令,在X S LT中以< x s l : c h o o s e >表示。
在這一點上,你可以想象聲明語言X S LT包含許多程序命令。事實上,產(chǎn)生聲明語言是讓你
不必顯式地告訴X S LT引擎輸出特定的內(nèi)容。若對其指定內(nèi)容或者模板,都將包含在輸出結(jié)果中。
盡管如此, X S LT仍然有一定的過程化特性。
現(xiàn)在看來前一個例子,僅僅想要在結(jié)果樹中包含< I T E M S >的部分S c r i p t i n g種類。為了這樣
做,我們需要一個過濾器,或一個i f命令,指出引擎“如果碰到這種情況就這樣做”。為了達(dá)到
這種結(jié)果,我們在模板中包括< x s l : i f >指令元素,像下面的例子這樣:
程序清單9 - 2 4
338使用XML 高級編程
下載
排序應(yīng)用于源
XML文檔樹
根據(jù)排序后的
樹創(chuàng)建HTML表
現(xiàn)在,在循環(huán)中我們包含了一個被滿足的條件。如果條件是真,模板中包含在< x s l : i f >中的
元素被插入結(jié)果樹中。否則,模板僅僅被跳過了。
在t e s t屬性中,我們比較字符串S c r i p t i n g和< C AT E G O RY >元素的數(shù)據(jù)內(nèi)容。實際上,我們使
用c o n t a i n s ( )函數(shù)檢驗是否< C AT E G O RY >元素文本節(jié)點包含S c r i p t i n g字符串。首先,如果字符串
s t r i n g 1包含字符串s t r i n g 2,c o n t a i n s ( s t r i n g 1 , s t r i n g 2 )函數(shù)返回布爾類型的T R U E,就像我們在上一
章看到的判斷部分。s t r i n g 1被使用< C AT E G O RY >數(shù)據(jù)內(nèi)容的C AT E G O RY/text() XPa t h表達(dá)式包
含。一個元素數(shù)據(jù)內(nèi)容總是一個字符串。
你可能注意到在屬性的值中,我們對字符串使用表達(dá)式' S c r i p t i n g '替代了" S c r i p t i n g ",使用單
引號而不是雙引號。這是因為僅僅整個屬性的值能被雙引號括起來。因此,任何需要被括起來
的表達(dá)式,像例子中的字符串那樣,僅能使用單引號,像下面的表達(dá)式這樣:
圖9 - 1 7的H T M L文檔的模式顯示了使用轉(zhuǎn)換樣式表。
圖9-17
有時我們需要一個命令顯示依賴于項目匹配的某種動作。例如,在前一個例子中,我們用
過濾基本樹的方法去轉(zhuǎn)換S c r i p t i n g類< I T E M >的一部分。在下一個例子中,我們將使用基于種類
類型的不同的轉(zhuǎn)換。
在這個例子中,我們想要表的每一行使用不同的顏色,每一個種類類型使用不同的顏色。
我們可以使用i f / e l s e i f方法,以< x s l : c h o o s e >元素的形式。這種形式總是和< x s l : w h e n >元素同時使
用的。每一個條件被< x s l : w h e n >命令判斷,更獨特的這種方式的判斷屬性:
中國航空網(wǎng) www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(113)