曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
程序清單9 - 4 2
所以,J a v a S c r i p t中包含排序對象的行變成:
s e l e c t S i n g l e N o d e ( )返回的是屬性節點,不是元素節點。每一個有一個或多個屬性的元素,在
文檔樹中,被轉化成有一個或多個屬性子節點的元素節點。所以, a t t r i b N o d e變量包含的是屬性
節點對象。
接下來,我們通過標題的順序來排序和顯示條目:
使用s o r t ( )函數:
程序清單9 - 4 3
首先,屬性節點對象的值設成了' T I T L E '字符串。實際上,這個有效地修改了擴展D O M。所
以這里代替用X S L修改X M L文檔,而是使用擴展D O M—在運行時, X S L樣式表可能被擴展
D O M和一段相應的腳本修改。
第二行需要更多的解釋。首先,你可能會自問, B o o k l i s t對象是從哪里來的。這個對象是在
X S L腳本中使用下面的命令創建的:
352使用XML 高級編程
下載
如你所見,當創建一個< D I V >元素時,我們就創建了一個名為B o o k l i s t的唯一標識對象。這
是一個H T M L元素,用來接收X M L到H T M L轉換的結果。所以,當下面的表達式被J a v a S c r i p t解
釋器執行時:
我們對初始的X M L文檔中的d o c u m e n t E l e m e n t對象調用了t r a n s f o r m N o d e ( )方法。這是一個
X S L的擴展D O M,用來排序x s l S t y l e s h e e t變量。然后,結果被排序放在B o o k l i s t對象的
i n n e r H T M L屬性中。這個會引起H T M L文檔的刷新,從而造成顯示刷新。然后排序后的表顯示在
屏幕上(見圖9 - 2 5)。
圖9-25
表頭被設置了C S S樣式,用于指示每次光標在表頭時,瀏覽器顯示出一只小手。用戶習慣于
在可被點擊的東西上定義一只小手。每一列的表頭都同一個s o r t ( )函數相聯,在這個例子中,行
為就像o n C l i c k事件的事件處理器。例如,如果用戶點擊了P r i c e列,那么排序函數被調用,使用
< o n c l i c k = " s o r t ( ' P R I C E ' ) " . . . >命令。s o r t ( )函數接收‘ P R I C E’字符串作為一個參數,設置為
a t t r i b N o d e變量的值。實際上,這個就改變了X S L樣式表。改動等于將下面的命令:
替換成:
同最初的X S L樣式表。在X S L擴展D O M已經被修改完畢,我們再一次地轉換了初始的X M L
文檔,使用改過的X S L樣式表,并且將這個轉換的結果作為HTML Booklist對象(如此命名是因
為< D I V >的i d)的i n n e r H T M L屬性的輸入。
所以,因為X S L文檔被轉換成一個樹狀命令(因為擴展D O M是對這棵樹提供的接口),就可
能使用這個接口修改X S L腳本。被修改的X S L腳本然后可以對原始文檔執行一個不同的轉換。所
以,為了得到基于用戶交互的不同結果, X S L腳本可以在腳本語言中被修改。
9.6 XSL轉換與DOM轉換的比較
X S L與D O M轉換處理的一個最主要的不同之處是, X S L是一種公布語言,而不是過程語言。
第9章轉換XML使用353 下載
因為這樣, X S L描述的是轉換后的文檔狀態與初始文檔的關系。D O M則是一種A P I,它允許對
樹狀命令進行操作。
我們看到前面WSH VBScript使用D O M來達到與我們使用X S LT樣式表同樣的轉換結果。但
是我們可以說,更精細的轉換引擎(由D O M 1或D O M 2規范所命令的)比X S LT來說限制更多。
這主要是因為, D O M 1和D O M 2規范沒有集成X P a t h表達式合并為到達一個特別的樹狀命令節點
的能力。所以,在某種條件下,用D O M來轉換X M L文檔要比使用X S LT要困難得多。如果未來
的D O M規范版本包括了通過X P a t h表達式到達一個特別節點的能力,那么使用D O M可能像使用
X S LT一樣容易和有效。
如同我們在其他的D O M使用的例子中看到的,一個X S LT樣式表可以轉換一個X M L文檔為
H T M L。結果的H T M L文檔可以包含腳本,用于在后面操縱內容的樹狀命令。腳本過程可以通過
用戶的動作被觸發,并且這些腳本可能包含使用DOM API的代碼來操縱與初始的X M L文檔相關
的X S LT文檔。這就是我們所做的,當用戶在一個表頭點擊時,我們改變一些X S LT元素的值
(存儲的值),來對這個列進行排序。在這個例子中, D O M用于改變X M L元素的屬性值,并且由
于X S LT本身也是一個X M L文檔,它也可以使用DOM API進行修改。這時, D O M通過提供排序
向X S LT轉換加入值,而不必在腳本中包括排序代碼。
總之,我們可以說在實際的技術狀態中, X S LT樣式表可以做得比使用DOM API腳本更易移
值。就像在開始看到的—現實的D O M 1和D O M 2規范不包含任何裝入和保存X M L文檔的命令。
因為所有這些原因,最好使用X S LT樣式表來進行轉換,而不是使用包含D O M命令的腳本。
9.7 小結
在這一章里,我們已經看過了轉換X M L文檔命令。特別是,我們花費了大量時間關注于
X S LT(X S L轉換)上。這需要X P a t h和X P o i n t e r的知識,在第8章已經學過了。
我們看到有幾個為什么需要轉換X M L文檔的原因。這些包括:
• 將X M L轉換為一種表式語言。
• 在X M L的不同詞匯表中進行轉換。
• 生成動態文檔。
X S LT實際上是一個巨大的專題,希望這一章能夠讓你習慣于這個特別規范的語法。而且關
于這個題目很可能將被寫成一本書(的確,留意一個Wr o x出版社的《X S LT Programmer’s
R e f e r e n c e》,ISBN 1-861003-12-9),這個將讓你習慣可用的全部功能,并且在寫你自已的轉換
樣式表時提供一個堅實的基礎。
由于在X S LT規范完成之前,在I E 5中可用的實現就被介紹了,所以它們有一些不同,包括一
些擴展。然而,也有一些可以用在你的應用程序中的X S LT處理器:
• XT - http://www. j c l a r k . c o m / x m l / x t . h t m l。
• SAXON - http://users.iclway. c o . u k / m h k a y / s a x o n。
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(116)