曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
一些我們在本章前面討論的查詢需求。
利用X T來測試X S LT和XPa t h查詢
隨著X S LT和XPa t h的興起,然而常用的XML 庫如M i c r o s o f t和S U N的安裝使用都不完全支持
X S LT和XPa t h,這些工作草案只能稱為建議性的。M i c r o s o f t已經允諾在下一個M S X M L版本中完
全支持X S LT和XPa t h,預計可以在2 0 0 0年1月份可以出來。到那時, James Clark(X S LT規范的
編者,XPa t h規范的編者之一)會提供出X L S T可安裝在J a v a類庫或者包的集合,并在Wi n 3 2環境
下可以運行。這些可從下面網址下載:
本章這一部分的所有例子都用X T進行了測試。X T的下載和使用須知可以在附錄G中找到。
本章所有例子都是在我們標準的c a t a l o g . x m l文件上操作的:
程序清單8 - 1 0 1
(1) 信息的行方式約束
298使用XML 高級編程
下載
在X M L中,信息的行方式約束等價于基于元素內容的元素約束。如我們所知, XPa t h表達式
就是被用來尋找具有給定值的字段。
因此,如果我們想返回目錄中作者為Alex Homer的書籍,我們可以使用下面的格式:
程序清單8 - 1 0 2
注意上面的格式中有兩個模板。名字為“ c h i l d n o d e s”的模板被用來遞歸地寫出節點的后代
元素,而這些節點正被寫入輸出X M L文檔—< x s l : c o p y >用來復制當前節點,同樣c h i l d n o d e s模
板把遇見的所有子節點復制到文件中。我們會在下面的幾個例子中使用這種技術。
用來執行行選擇的這部分模板是位于第一個模板中的塊< x s l : f o r- e a c h >。這個塊僅選擇文檔
中待輸出的那些書—位于方括號內的,和XPa t h表達式相匹配的那些(如我們所知,選擇帶有
文本Alex Homer的< A u t h o r >元素)。在遇見我們的c a t a l o g . x m l文檔時該腳本輸出會返回A l e x編著
的三本書:
程序清單8 - 1 0 3
第8章鏈接和查詢使用299 下載
(2) 返回信息的列方式約束
對于X M L來說,通過對文本水平的元素或者由一個樣式表的返回屬性進行約束可以達到對
返回信息進行列方式約束的目的。假如說我們想從整個書籍清單中提取一些書的標題,而A l e x
H o m e r是這些書的有貢獻作者,我們可以使用下面的樣式表:
程序清單8 - 1 0 4
這里,我們把另外一個XPa t h表達式作為孩子來從被選書籍中選擇標題—僅返回被選書的標
題。很明顯,在第二個s e l e c t指令中可以修改XPa t h來改變文本元素—或者列—正在被返回的。
上面的查詢返回下面的輸出:
程序清單8 - 1 0 5
注意我們在中間增加了空白以使X T的輸出更具可讀性。
(3) 返回信息概括
X M L信息可利用XPa t h的內置集成函數來進行歸納總結。例如,我們如果想獲取部分由A l e x
H o m e r完成的每本書的總頁數,可以采用下面的樣式表:
300使用XML 高級編程
下載
程序清單8 - 1 0 6
這里我們把使用< x s l : v a l u e - o f >元素中XPa t h表達式選擇出的< P a g e s >元素的數量值用sum( )函
數累加起來就可以了。注意我們利用XPa t h表達式按照同樣的方式對價格進行操作,因為在目錄
中定義< P r i c e >元素時,加了一個前綴$。由于XPa t h提供了一些用于處理字符操作的函數,它不
能對按照S Q L命令相同的方式對集合進行操作,那樣會使嵌套操作(例如,去掉前導美元符,
并把結果數值累加起來)變得很困難。
把這個格式頁面應用于c a t a l o g . x m l文檔之后。我們有:
程序清單8 - 1 0 7
(4) 排序
現在我們把查詢延伸一下,來查詢是Alex Homer是作者之一的那些書籍。我們也對返回的
書按照標題進行排序(按字母順序):
程序清單8 - 1 0 8
我們只需把< x s l : s o r t >元素添加到< x s l : f o r- e a c h >元素。它指明了< x s l : f o r- e a c h >元素的S e l e c t屬
性返回的節點集按照Ti t l e排序。
第8章鏈接和查詢使用301 下載
這是我們的轉換輸出:
程序清單8 - 1 0 9
(5) 內部連接
由于X M L文檔具有像指針一樣的包含方式,將內部連接的概念應用于它們就不太必要了
—如果信息塊已經包含在你所具備的那一部分,就沒有必要再去查找了。另一方面,如果我
們利用I D和I D R E F屬性把元素之間連接起來,我們則需要這個功能。XPa t h允許我們沿著節點樹
來將一個文檔貫穿起來,允許我們產生一些類似于S Q L內部連接機制提供的選擇書-作者對,而
這些書的作者之一為Alex Homer:
程序清單8 - 11 0
這里,我們使用了兩個< x s l : f o r- e a c h >塊。第一個塊處理問題的過濾方面:哪些書是你感興趣
的?第二個塊,沿著節點樹向下反復瀏覽來得到我們感興趣的東西: < A u t h o r >元素。然后再沿著
節點樹向上瀏覽—去獲得我們感興趣的另一個信息塊,也就是書的標題。下面是轉換輸出:
程序清單8 - 111
302使用XML 高級編程
下載
(6) 外部連接
由于還是由于X M L文檔提供了包含功能,外部連接也向關系數據庫那樣重要—處理器只
需查看一下一元素即可弄清楚信息塊存在還是不存在。不過,通過瀏覽文檔樹,來提供一些類
似外部連接所提供的功能還是可行的。假如我們提取一列書籍,指明這些書是不是由A l e x
H o m e r完成了一部分。在S Q L中,我們可以使用外部連接,如果一本書Alex Homer并沒有寫其中
的一部分,則返回N U L L。在X S LT中,我們可以利用count( )函數和< x s l : c h o o s e >分支元素來提
供類似功能:
程序清單8 - 11 2
第8章鏈接和查詢使用303 下載
這里,我們來驗證一下Alex Homer是不是每本書的有貢獻作者之一(函數c o u n t()行使檢
查功能);然后我們根據條件元素< x s l : c h o o s e >代表的路徑采用一種方法來創建元素。變換結果
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(103)