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