曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
板。
第一個節點同文檔的根相匹配:
程序清單9 - 1 8
X M L文檔可以與樣式表相關聯,使用一個<?xml-stylesheet ...?>處理指令。我們想讓文檔與
一個C S S樣式表相關聯,所以不得不寫在模板中以便讓命令文檔中包含處理指令。
為了在結果樹中創建處理指令,我們使用一個特別的X S L命令,< x s l : p r o c e s s i n g - i n s t r u c t i o n >
元素。n a m e屬性提供了處理指令的名字,數據內容為其他所有的屬性。所以下面的X S L元素:
第9章轉換XML使用331 下載
被轉化為命令樹為:
包含在模板中的其他< B O O K L I S T >元素將被插入到結果樹中。現在熟悉的< a p p l y - t e m p l a t e s >
命令指示X S LT處理器應該處理所有的子元素,由于沒有一個選擇標準—子元素將被處理成當
前節點的子節點—然后,這些節點將同模板進行匹配。如果一個包含數據的孩子沒有一個匹
配的模板,它被插入到結果樹中。否則,如果同一個模板相匹配,模板被處理,并且它的內容
將包含在結果樹中。
你可能已經注意到,沒有模板匹配< B O O K L I S T >元素。X S LT引擎有一個隱含的模板用于匹
配任何一個沒有明確指定模板的元素。這個模板允許遞歸處理,用于處理與模式相匹配的沒有
明確定義模板的元素。這個隱含的模板被定義為:
所以< B O O K L I S T >元素,它沒有一個明確定義的模板規則,與隱含的模板相匹配。這個隱
含模板也可以叫做缺省模板。
< B O O K L I S T >元素包含< I T E M >元素,對于它存在一個模板。實際上,這是一個我們想重新
組織的元素。重新組織< I T E M >元素相當容易,我們只是包含了按照需要排列的元素。如果不得
不加入新的元素,只需簡單地在模板中包含它們。
我們使用< x s l : a p p l y - t e m p l a t e s >命令與用在第一個模板的頗為不同。在前面我們使用s e l e c t屬
性來指示X S LT引擎,只有與選擇標準匹配的元素使用明確的模板,否則使用缺省的模板。
下面的表達式在輸出樹中包含了初始X M L文檔的< T I T L E >的數據內容。
s e l e c t屬性的X P a t h表達式用來指示X S LT引擎, < T I T L E >元素的文本節點的內容將插在
< x s l : a p p l y - t e m p l a t e s >命令所在的相同地方(參見圖9 - 11)。
圖9-11
注意這里是與< I T E M >元素相匹配的模板,因為< T I T L E >元素的節點是它的孩子,正確的表
達示應該是“T I T L E / t e x t ( )”。如果我們使用“/ / T I T L E / t e x t ( )”來代替,所有< T I T L E >元素的內容
將會如下被插入到結果樹中:
332使用XML 高級編程
下載
當前節點當前節點指針指向
<ITEM>節點。表達
式“TITLE/text()”
僅與一個子節點匹配
這是因為加入“/ / T I T L E”意味著“處理所有從根節點繼承的節點(對于元素類型),名字為
< T I T L E >。”注意, X P a t h表達式“ . / / T I T L E / t e x t ( )”意思是“處理所有從當前選中節點繼承的名
字< T I T L E >的節點”。在/ /前加.則意思就完全不同了(參見圖9 - 1 2)。
圖9-12
所以,包含在模板中的匹配< I T E M >節點的所有<xsl:apply-template select ...>命令都是相對
于當前選中節點的。在我們的例子中,這就是< I T E M >節點。當前節點的游標通過模板的匹配屬
性移動到< I T E M >元素:
程序清單9 - 1 9
第9章轉換XML使用333 下載
當前節點
當前節點指針指向
<ITEM>節點,表
達式“TITLE/text()”
與根節點下名稱為
<TITLE>的所有
<ITEM>子孫節點
匹配
像前面我們看到的,有一個可替換的方法來從初始X M L文檔中提取正確的信息。如下面舉
例所示,所有< x s l : a p p l y - t e m p l a t e s . . . / >命令的地方被<xsl:value-of .../>命令所替換:
程序清單9 - 2 0
我們看到了有兩種方法在正確的地方插入正確的元素:
• 使用< x s l : a p p l y - t e m p l a t e s >命令。
• 使用< x s l : v a l u e - o f >命令。
我推薦使用第二個命令—< x s l : v a l u e - o f >—它明確地告訴我們是被選節點的值插入到輸
出樹中去。你可能已經注意到,我們在選擇表達式中沒有包括“ t e x t ( )”指令,因為元素的值就
是它的數據內容。
新的數據內容也可被加入到輸出內容中。例如,我們想在結果數據的開始處包含C a t e g o r y :
表達式,這樣我們可以得到像這樣的代碼:
再一次,我們使用< x s l : v a l u e - o f . . . / >命令,它被< C AT E G O RY >元素的內容所替換,但是我們
也加入了文本C a t e g o r y(參見圖9 - 1 3)。
使用X S LT轉換文檔格式在大多數場合是非常重要的。為了以適當的方式顯示X M L文檔,我
們使用X S LT轉換成另外一種格式。當在結果文檔里使用相同的標簽時,我們插入內容,從模板
中使用< v a l u e - o f >或者< a p p l y - t e m p l a t e s >命令獲得源文檔數據元素,自己寫進元素中去。我們很
容易地創建新的標簽,文檔能被轉換成一個完全新的詞匯表。我們能夠使用以前的例子(在第2章
334使用XML 高級編程
下載
曾經介紹過)轉換這個文檔成詞匯表。
圖9-13
這種技術能完美地將文檔轉換成表示語言,例如HTML, WML(Wireless Markup Languages)。
當我們以不同的X M L命令交換信息時,這對于轉換不同的內容是非常有用的。例如,當我們轉換金
融數據的時候,一個公司使用F P M L ,另一個公司使用F i n X M L ,我們能在兩者之間轉換。
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(112)