XML產(chǎn)生器讀取這些數(shù)據(jù)并產(chǎn)生SAX事件,用以匹配前面例子(例子1和例子2)的XML輸入文檔. 從而預(yù)處理器接收到的數(shù)據(jù)與例子2的預(yù)處理器接收到的輸入數(shù)據(jù)是相似的.轉(zhuǎn)換的其余部分與轉(zhuǎn)換2b類似. 結(jié)果輸出文件(<EXAMPLE_ROOT>/input/result_3.2.html) is also similar to 與轉(zhuǎn)換2b的輸出文件 (file <EXAMPLE_ROOT>/output/result_2.1b.html)也是相似的.
Example 1的Transformer實(shí)體由class Example1 ,ExampleTester和Example接口實(shí)現(xiàn)。Class ExampleTester解析輸入?yún)?shù),創(chuàng)建Example1的實(shí)例,Example1實(shí)現(xiàn)了Example接口,并且調(diào)用doTransform()方法。圖例5是Example的類圖。綠色框內(nèi)的是J2SE的標(biāo)準(zhǔn)庫。如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 比較有趣. 讓我們仔細(xì)閱讀:
<a href="/uploadImages/2007-5-2/2007529494878685.gif" target="_blank"> </a> 點(diǎn)擊看大圖 Figure 8. Class diagram of Example 2. Click on thumbnail to view full-sized image.
竅門在于characters() 方法沒有馬上調(diào)用 defaultCharactersHandler, 因此原始數(shù)據(jù)沒有被轉(zhuǎn)發(fā)(forWord)。 在endElement() 方法, defaultCharactersHandler() 和 defaultElementHandler() 被調(diào)用called. defaultCharactersHandler()調(diào)用時(shí) 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 元素結(jié)束
·characters(char[], int, int): XML 元素的內(nèi)容
·endDocument():XML 文檔結(jié)束
如下面的調(diào)用與price元素對應(yīng):
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>");
對應(yīng)的 XML 元素:
<PRICE>20</PRICE>
總結(jié)
這篇文章主要介紹怎樣使用SAX和XSLT完成復(fù)雜的數(shù)據(jù)轉(zhuǎn)換,用SAX處理XML數(shù)據(jù)進(jìn)行“預(yù)處理“,而后XSLT進(jìn)行轉(zhuǎn)換. Example 1 介紹了基本的XSLT 轉(zhuǎn)換器. Example 2 演示了怎樣操控XML數(shù)據(jù),并提供給XSLT轉(zhuǎn)換器。 Example 3 演示了怎樣從非XML數(shù)據(jù)生成XML數(shù)據(jù),進(jìn)而應(yīng)用XSLT轉(zhuǎn)換處理,Example 4 演示了怎樣使用XSLT生成非XML數(shù)據(jù)。