曝光臺(tái) 注意防騙
網(wǎng)曝天貓店富美金盛家居專營(yíng)店坑蒙拐騙欺詐消費(fèi)者
輸出如下:
程序清單8 - 11 3
(7) 表內(nèi)容操作
由于X S LT是在源文檔的變換后版本,而不是在源文檔上操作的,所以不會(huì)修改原始文檔。
正如前面我們所討論的,有一些其他工具更適合于X M L文檔的這類操作。
(8) 從不止一個(gè)數(shù)據(jù)源返回信息
304使用XML 高級(jí)編程
下載
X S LT提供一個(gè)函數(shù)xsl:document( )來(lái)使擴(kuò)展文檔在基礎(chǔ)文檔被轉(zhuǎn)換的同時(shí)被處理。這就保
證了可以從多個(gè)數(shù)據(jù)源中抽取信息并集成到一個(gè)結(jié)果中。例如,假如說(shuō)我們有一個(gè)文檔位于和
頁(yè)面s t a t u s . x m l相同的目錄,而這個(gè)頁(yè)面描述了c a t a l o g . x m l所顯示的信息的狀態(tài):
程序清單8 - 11 4
現(xiàn)在,讓我們看一下當(dāng)我們請(qǐng)求Alex Homer所著書(shū)籍的標(biāo)題時(shí),如何把< G e n e r a t e d D a t e >元
素從文檔添加到結(jié)果的結(jié)構(gòu)中去:
程序清單8 - 11 5
我們已經(jīng)引導(dǎo)X S LT處理器打開(kāi)文檔s t a t u s . x m l,并把元素< G e n e r a t e d D a t e >添加到了變換文
檔的根元素< C a t a l o g >中。注意,普通的定位步驟可用來(lái)對(duì)函數(shù)document ( )產(chǎn)生的節(jié)點(diǎn)集進(jìn)行過(guò)
濾。
產(chǎn)生的X M L文檔為:
程序清單8 - 11 6
(9) 程序處理
第8章鏈接和查詢使用305 下載
雖然利用X S LT進(jìn)行某種程度的程序處理是可能的,但是它卻不能提供和S Q L服務(wù)器或者
Oracle 相近的東西。例如,元素< x s l : f o r-each >支持限制形式的游標(biāo)(允許每次一個(gè)地對(duì)節(jié)點(diǎn)集
中的獨(dú)立節(jié)點(diǎn)進(jìn)行操作),卻不允許編程時(shí)游標(biāo)向前或者向后“移動(dòng)”。讓我們看最后一個(gè)例子
—產(chǎn)生一列c a t a l o g . x m l包含的作者及每個(gè)作者參與寫(xiě)作的書(shū)的標(biāo)題。
在S Q L中可以采用下列指令進(jìn)行刷新:
程序清單8 - 11 7
這樣可以產(chǎn)生表8 - 1 0所示結(jié)構(gòu)類型的結(jié)果。
表8 - 1 0
作者標(biāo)題
Alex Homer IE 5 XML Programmer's Reference
Alex Homer Professional ASP 3.0
Alex Homer Beginning Components for ASP
Brian Francis Professional ASP 3.0
⋯
系統(tǒng)接受這種單調(diào)的結(jié)構(gòu),然后提供一個(gè)消除重復(fù)作者信息的方法。另一部分利用在
S E L E C T指令中采用D I S T I N C T關(guān)鍵字首先提取作者,然后提取每位作者所著的書(shū)。
我們希望完美的X S LT轉(zhuǎn)換輸出看起來(lái)該是下面這個(gè)樣子:
程序清單8 - 11 8
為了達(dá)到這個(gè)目的,我們準(zhǔn)備使用一種新的X S LT元素類型—而且是可行的—利用它連
回到文檔中另一個(gè)位置。讓我們看一下如何實(shí)現(xiàn),完整的頁(yè)面如下所示:
程序清單8 - 11 9
306使用XML 高級(jí)編程
下載
我們把上面拆開(kāi),逐個(gè)看每一部分,首先:
程序清單8 - 1 2 0
這里,我們先利用< x s l : f o r- e a c h >產(chǎn)生一個(gè)關(guān)于文檔中出現(xiàn)的作者名字的游標(biāo)。注意,這里
會(huì)產(chǎn)生一個(gè)副本—每次一本書(shū)的作者將會(huì)被提到,作者的名字會(huì)出現(xiàn)在列表中。我們來(lái)看一
下如何盡快將這些名字區(qū)分開(kāi)來(lái):
我們將按字母順序?qū)γ峙判颍ㄟ@里對(duì)第一個(gè)名字排序)。
程序清單8 - 1 2 1
這個(gè)指令存儲(chǔ)了正在變量中出現(xiàn)的作者的值。在環(huán)境信息發(fā)生改變的時(shí)候,這將是回指信
息的一個(gè)很好的方法,后面我們將會(huì)看到這一點(diǎn)。
程序清單8 - 1 2 2
這是我們處理區(qū)分問(wèn)題的一種不太好的方法。對(duì)于一位作者的每本書(shū)來(lái)說(shuō),通過(guò)< x s l : f o re
a c h >元素的select 屬性選擇節(jié)點(diǎn)會(huì)發(fā)生重復(fù)—例如,Alex Homer的名字會(huì)出現(xiàn)三次。為保證
每位作者僅操作一次,我們將作下面的測(cè)試。把XPa t h翻譯成英語(yǔ),這個(gè)測(cè)試是這樣的:“O n l y
proceed if there's no <Author> element that appears earlier in the (original) document with the same
t e x t .”很自然地,這將保證每位作者真正出現(xiàn)一次,這樣我們就可以得到正被尋找的這種區(qū)別。
(另外,由于X S LT變量范圍規(guī)則的原因,在變量中保存上一個(gè)作者名,并和當(dāng)前的作者相比較,
來(lái)看看是否發(fā)生了變化,“傳統(tǒng)的”方法將不起作用)。
第8章鏈接和查詢使用307 下載
程序清單8 - 1 2 3
我們創(chuàng)建了帶有作者名字(從變量中得到)的< A u t h o r >元素和< N a m e >元素。
程序清單8 - 1 2 4
這里我們?yōu)槲臋n中作者和當(dāng)前作者相匹配的所有書(shū)的示例了另外一個(gè)游標(biāo)。注意在這里我
們沒(méi)有使用“ .”來(lái)代替$ t h i s a u t h o r—因?yàn)榉嚼ㄌ?hào)內(nèi)索引的上下文正好是正被核對(duì)的< B o o k >元
素的上下文,而不是第一個(gè)< x s l : f o r- e a c h >的上下文。在使用X S LT時(shí)了解上下文對(duì)避免產(chǎn)生不希
望的結(jié)果是很關(guān)鍵的。
程序清單8 - 1 2 5
我們將書(shū)的< Ti t l e >元素寫(xiě)到輸出中,并繼續(xù)迭代:
程序清單8 - 1 2 6
該頁(yè)面的輸出為:
程序清單8 - 1 2 7
308使用XML 高級(jí)編程
下載
8.6.5 查詢語(yǔ)言展望
雖然X S LT和XPa t h可以使開(kāi)發(fā)者在相當(dāng)大程度上對(duì)查詢和X M L文檔內(nèi)容表達(dá)進(jìn)行操縱,然
而W 3 C表示這兩種技術(shù)不是查詢的最終解決方案。一些查詢(像上面的b o o k s - p e r- a u t h o r查詢)
如果使用X S LT和XPa t h將相當(dāng)困難,而且查詢語(yǔ)言中通常出現(xiàn)的一些附加功能(如元素的添加
或更新)是沒(méi)有用的。W 3 C已經(jīng)成立一個(gè)X M L查詢研究小組( XML Query Working Group)來(lái)
研制從真實(shí)和虛擬的文檔中提取數(shù)據(jù)的靈活的網(wǎng)絡(luò)查詢工具。不過(guò),在本書(shū)寫(xiě)作的時(shí)候,該小
組還沒(méi)有任何成果出來(lái),我們期待不久一種更新的查詢技術(shù)草案能夠出現(xiàn)。
8.7 小結(jié)
這一章我們討論一些目前最新的訪問(wèn)和操作X M L文檔的最新技術(shù):
• 回顧了W3C Inforset,W 3 C用它來(lái)描述組成X M L文檔的信息塊。
• 回顧了XLi n k規(guī)范,它定義了在數(shù)據(jù)源之間的文檔中創(chuàng)建鏈接的機(jī)制。
• 回顧了XPo i n t e r,它定義了指向X M L文檔中特定位置或者位置范圍的機(jī)制。
中國(guó)航空網(wǎng) www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級(jí)編程上(104)