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