曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
點。
首要的任務是告訴X S LT引擎所期望的輸出。在這個例子中,希望是一個H T M L的結果,指
出使用:
像一個處理器一樣,了解期待的輸出格式,你將從源文檔樹中的根節點開始。然后在樣式表中
匹配根節點,找到相對應的模板。注意,根節點是文檔的節點,不是第一個元素。在這個例子
中,根節點不是< C a t a l o g >元素,而是X M L文檔本身。那么,我們有一個匹配文檔根的模板嗎?
回答是肯定的。如果你還記得在上一章X P a t h部分,一個文檔的根也可以表示為一個“ /”符號。
這一點我們看到在第一個模板中很明確:
程序清單9 - 9
所以,你已經找到了匹配源文檔中根元素的模板了,F在要做什么?為了更好地表示在
X S LT處理器的頭部發生了什么,想象一個游標航行于初始的X M L文檔節點樹;它的位置是當前
節點,現在當前節點是根元素。
第1步:你已經定位了當前游標在根節點處,并且在X S LT命令中發現了一個相匹配的模板。
模板有一個“ /”模式。所以,輸出下面的結果。記住,我們工作于一個抽象的樹狀命令中,表
示出來就是圖9 - 6中左邊的部分:
322使用XML 高級編程
下載
圖9-6
在第一個模板的中間,嵌套在< B o d y >元素間的是一個< x m l : a p p l y - t e m p l a t e s / >命令。這就是
我們將書寫內容的頁面。它有一個叫做s e l e c t的屬性,它的值是一個X P a t h表達式。這個命令的
意思是:
“從X P a t h的查詢“/ / B o o k”中,得到一個節點列表。然后,對于這個節點列表中的每個節點,
試著匹配一個模板。如果一個匹配找到了,則應用模板。”
但是“/ / B o o k”是什么意思?它的意思就是“選擇從根節點派生出的< B o o k >元素”。
第2步:更深一步地進入我們的X S L文件中,找到一個匹配< B o o k >元素( < x s l : t e m p l a t e
m a t c h = " B o o k " >)的模板,所以下一步我們就應用這個模板給節點列表中的第一個< B o o k >元素。
我們的當前游標現在在第一個< B o o k >節點上。
第3步:我們然后插入與< B o o k >匹配的模板內容到<apply-templates select="//Book"/>命令的
位置處。首先我們加入缺省的C S S樣式屬性給書的數據—任何更深一層的元素不包含特定C S S
樣式屬性將繼承這些屬性。接下來,我們找到另一個< a p p l y - t e m p l a t e s / >,這次使用了一個
“Ti t l e”的s e l e c t屬性。根據第一步的規則,我們知道這個要求命令一個< Ti t l e >節點的集合。然
而,這一次當前節點是第一個< B o o k >節點,并且我們的X P a t h表達式指示了,新節點將只包含
當前子節點中的< Ti t l e >節點。這就意味著我們的節點集將由第一個< B o o k >節點的< Ti t l e >子節點
組成。
從這里我們開始看到了所使用的X P a t h表達式的多功能性。如果打算替換成< x s l : a p p l y -
templates select=“/ / Ti t l e”/ >用于存在的節點,節點集中將包含所有從根節點(< B o o k >節
點的根節點)繼承下來的<Title>—這將意味在樹林中的所有<Title>節點(參見圖9-7)。
圖9-7
第4步:接著我們試圖匹配一個模板針對于我們的節點集中< Ti t l e >節點。再一次我們找到了
第9章轉換XML使用323 下載
一個匹配:<xsl:template match=“Ti t l e”>模板。然后在<xsl:apply-templates select=“Ti t l e”/ >
命令的位置插入這個模板的內容。
第5步:< Ti t l e >匹配模板的內容由一些C S S樣式屬性和一個<xsl:value-of select="."/>元素組
成。這個命令取出通過s e l e c t屬性指定的節點的值。在這個例子中, X P a t h是“.”,意思是< Ti t l e >
節點本身,所以我們輸出< Ti t l e >節點的內容(參見圖9 - 8)。
圖9-8
第6步:現在對于在< B o o k >中創建的節點集,對所有的節點使用了與之相匹配的模板。所以
移動到最先創建的節點集中的下一個節點—是第二個< B o o k >節點。采用與第一個< B o o k >節點
同樣的方法,所以我們重復執行第四和第五步。循環進行處理,直到所有的< B o o k >元素都被處
理完畢。
在這個處理過程中,我們不僅僅將一個X M L文檔從某種文檔格式轉換到另一種,而且在處
理中也執行一些編輯—只有< B o o k >和< Ti t l e >元素被轉換了。而且,轉換不只是一到一的轉換。
對于初始文件中的每個元素,在結果文檔中都可能有一個以上的元素。
我們應該在這里注意一些重要的事情。與< Ti t l e >相匹配的模板沒有在結果樹中插入元素,
它插入的是文本節點。如前所說,一個樹林是一種內部分級命令。當X M L文檔轉換成這種分級
命令,我們轉換文本文檔為樹形模型。在這棵樹中, 孩子元素也是樹的子節點。數據內容也是
一個子節點。例如, < B o o k >元素包含一個< Ti t l e >元素,這個< Ti t l e >元素不包含元素,但是包含
數據內容,它變成一個子節點。
那么,當假裝是一個X S L引擎時我們學到了什么?
• 首先是我們創建了一個樹林,它是文檔的一種內部樹形表示。這個樹林總是有一個根元素。
根元素表示X M L文檔—它不是文檔的頂層元素。然后,在根元素的下面是節點層次。每
個節點都被打印出來。例如,一個節點可以表示一個D T D、模式或一條處理指令。如果一
個元素有屬性,那么每一個元素也有一個屬性節點的集合。如果一個節點有數據內容,那
么數據內容被加到元素節點中。因此,一個元素節點可能有一個屬性節點的集合和一個數
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(109)