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数据。