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