XML產生器讀取這些數據并產生SAX事件,用以匹配前面例子(例子1和例子2)的XML輸入文檔. 從而預處理器接收到的數據與例子2的預處理器接收到的輸入數據是相似的.轉換的其余部分與轉換2b類似. 結果輸出文件(<EXAMPLE_ROOT>/input/result_3.2.html) is also similar to 與轉換2b的輸出文件 (file <EXAMPLE_ROOT>/output/result_2.1b.html)也是相似的.
Example 1的Transformer實體由class Example1 ,ExampleTester和Example接口實現。Class ExampleTester解析輸入參數,創建Example1的實例,Example1實現了Example接口,并且調用doTransform()方法。圖例5是Example的類圖。綠色框內的是J2SE的標準庫。如StreamSource,StreamResult和javax.xml.transform.stream
Figure 5. Class diagram of Example 1. Click on thumbnail to view full-sized image.
Example1 的doTransform() 方法 in Example1 比較有趣. 讓我們仔細閱讀:
<a href="/uploadImages/2007-5-2/2007529494878685.gif" target="_blank"> </a> 點擊看大圖 Figure 8. Class diagram of Example 2. Click on thumbnail to view full-sized image.
竅門在于characters() 方法沒有馬上調用 defaultCharactersHandler, 因此原始數據沒有被轉發(forWord)。 在endElement() 方法, defaultCharactersHandler() 和 defaultElementHandler() 被調用called. defaultCharactersHandler()調用時 is 傳如了來自DataAccessor的改變的值called with a modified value received from DataAccessor. DataAccessor 接口interface如下:
1. package myutil.dataAccess;
2. public interface DataAccessor {
3. public String getCustomerName(String _customerId);
4. public String getProductName(String _productId);
·startElement(String, String, String, Attributes): XML 元素開始
·endElement(String, String, String): XML 元素結束
·characters(char[], int, int): XML 元素的內容
·endDocument():XML 文檔結束
如下面的調用與price元素對應:
myHandler.startElement("", "<PRICE>", "<PRICE>", new AttributesImpl());// Converting String "20" to char array char[] myChArray = new char[255];"20".getChars(0, 2, myChArray, 0);// Conversion donemyHandler.characters(myChArray, 0, 2);myHandler.endElement("", "<PRICE>", "<PRICE>");
對應的 XML 元素:
<PRICE>20</PRICE>
總結
這篇文章主要介紹怎樣使用SAX和XSLT完成復雜的數據轉換,用SAX處理XML數據進行“預處理“,而后XSLT進行轉換. Example 1 介紹了基本的XSLT 轉換器. Example 2 演示了怎樣操控XML數據,并提供給XSLT轉換器。 Example 3 演示了怎樣從非XML數據生成XML數據,進而應用XSLT轉換處理,Example 4 演示了怎樣使用XSLT生成非XML數據。