这篇文章从书中选出了我认为非常重要的10条技巧。但实际上这有限的10条只是粗略的描述了什么是可能的。其中大多数都集中在Java与XSLT的组合上,而不是在XSLT(可扩展样式表转换)技术规范。而更详细的信息,在文章结尾处指出了一些有价值的资源。
基本的XSL转换是非常简单的:一个或多个包含着指令的XSLT样式表,这些指令定义了如何把XML数据转换成其他格式。XSLT处理器完成实际的工作;Sun微系统的Java API for XML Processing (JAXP)为不同种类的处理器提供了一套标准的Java接口。这里有一个用JAXP的API执行XSL转换的简单例子:
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
public class Transform {
/**
* Performs an XSLT transformation, sending the results
* to System.out.
*/
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: java Transform [xmlfile] [xsltfile]");
System.exit(1);
}
File xmlFile = new File(args[0]);
File xsltFile = new File(args[1]); // JAXP reads data using the Source interface
Source xmlSource = new StreamSource(xmlFile);
Source xsltSource = new StreamSource(xsltFile);
// the factory pattern supports different XSLT processors
TransformerFactory transFact = TransformerFactory.newInstance();
Transformer trans = transFact.newTransformer(xsltSource);
trans.transform(xmlSource, new StreamResult(System.out));
}
}
你可以点击这里下载一个很小的ZIP文件,这个文件包含了这个例子以及相应的XSLT样式表和XML数据文件。其中的README文件解释了怎样编译和运行这个例子。
这个这个例子是利用StreamSource从文件中读取数据,JAXP还能从SAX解释器或DOM树来读取XML数据。下面依次介绍我推荐的10条技巧:
1、 尽可能使用缓存。
执行XSLT转换是很耗费CPU和内存的,所以在任何时候进行可能的优化都是很有意义的。使用由XSLT驱动的Web应用,提高它的实时运行性能表现的最好方法之一就是使用各种类型的缓存技术。
图一举例说明了一个典型的使用XSL对数据库进行转换的Web应用。
图一、典型的XSL转换
与动态生成的XML不同,XSLT样式表是静态存储在文件中的。由于这些文件很少被改动,就可以用JAXP的javax.xml.transform.Templates接口把它们解析好了进内存里缓存起来。下面这个程序片断解释了这个过程是怎样完成的:
Source xsltSource = new StreamSource(xsltFile);
TransformerFactory transFact = TransformerFactory.newInstance();
Templates cachedXSLT = transFact.newTemplates(xsltSource);
Transformer trans = cachedXSLT.newTransformer();
当XSLT样式表通过Templates接口缓存进了内存中,现在它就可以被重复用于很多不同的转换里。最重要的好处是,这样就避免了重复把XSLT解析进内存。它也给了XSLT处理器一个机会来优化转换指令,就象编译器优化软件那样。
有人可能会想是否可以把XML数据也缓存进内存中。对于那些高度动态和个体化的应用,XML数据是随着每一个客户请求而动态生成的并随时都在变化。对于这种应用,缓存是不实际的。对于很多其它类型的应用,XML数据可能改变的不是很频繁。当数据改变不是很频繁时,相对于缓存XML数据,将转换后的结果缓存可能更有意义。这是一种最快的可行性解决方案,推荐在任何可行的情况下使用。
2、部署前做测试。
在开发Web应用项目选择XML和XSLT的关键在于可以清楚的把数据、程序逻辑和表达分开。Java代码与后台数据源交互并生成XML数据,XSLT样式表把XML数据转换为XHTML(或WML,或其它),然后浏览器显示结果。
这种结构的一个独特的,然而时常被忽略的好处是它支持自动单元测试的能力。象JUnit这样的工具鼓励程序员去写适合自动单元测试的套件。这些测试大大的减少了在系统中加入新特性时所产生的错误。考虑一下一个典型的Java+XML+XSLT网站的这些组件:
· 用Java实现商业逻辑。由于Java代码没有和表达逻辑混在一起,就可以象其他任何Java代码一样测试它。
· 把应用数据转换为XML。这一步是特别容易的。只要生成XML然后用一个DTD或一个XML Schema验证它就行了。
· 把XML转换为XHTML。同样的,生成的XHTML可以用一个XHTML DTD来验证。虽然这样做不能证明信息是正确的,但是的确能保证XHTML被正确的生成而且是有效的。
与很多其它的Web开发技术不同,测试这些单元中的任何一个都不用将其部署到Web服务器上。这使自动单元测试更容易被实现,自动单元测试也是极限编程(XP