使用Xalan进行XSLT程序设计
--第一个使用Xalan的例子
- 什么时候需要进行XSLT程序设计
- 关于IE5和Mozilla的基本背景知识
- Tomcat和jdk1.3的配置
- 第一个使用Xalan的程序的例子
- 术语与背景知识
- 使用javascript及其他语言扩展XSL
- 使用java扩展XSL
- 使用Xalan的命令行工具
- 在Applet中使用Xalan
- 调试(debug)一个xslt文档
- XSLTC
- DTM
下面我们用一个例子来演示以下使用Xalan进行XSLT程序设计的最基本过程,这是一个最基本的JSP程序,简单到不可能在简单的地步了。我想通过这个程序来让大家了解Xalan进行XSLT是多么的简单。实话实说,尽管猛一看大家什么都不会,实际上进行XSLT程序设计并不难。在这个程序里面,所有的工作实际上可以仅仅用四步来完成。
- 使用javax.xml.transform.TransformerFactory的newInstance方法创建一个javax.xml.transform.TransformerFactory的实例。
- 使用javax.xml.transform.TransformerFactory中的newTemplates方法创建一个javax.xml.transform.Templates的实例。javax.xml.transform.Templates是一个界面,其实现与界面的提供者无关,可以通过设置来更改,在Xalan和sun提供的jaxp1.1中是由Xalan提供的。
- 使用javax.xml.transform.Templates的newTransformer方法创建一个javax.xml.transform.Transformer的实例。javax.xml.transform.Transformer同样是一个可以更改其实现的实例。(第二步和第三步在部分情况下可以合并,使用javax.xml.transform.TransformerFactory中的newTransformer方法来完成,具体我们会在后面讨论。)
- 使用Transformer中的transform方法进行转换,这里要用到javax.xml.transform.Source类处理输入和javax.xml.transform.Result类处理输出。
<%@ page contentType="text/html; charset=GB2312"
import="java.io.File"
%> <%
//使用TransformFactory界面的newInstance方法创建一个新的实例。
//TransformFactory的缺省实现是Xalan提供的org.apache.xalan.processor.TransformerFactoryImpl类
javax.xml.transform.TransformerFactory tFactory =
javax.xml.transform.TransformerFactory.newInstance();
//使用TransformFactory界面的newTemplates方法创建一个Templates界面的实现对象。
//Templates的缺省实现是Xalan提供的org.apache.xalan.templates.StylesheetRoot
javax.xml.transform.Templates oTemplates = oFactory.newTemplates(
//使用一个StreamSource对象来读取一个xsl文档
new javax.xml.transform.stream.StreamSource(request.getRealPath("/")+"xslt"+File.separator+"atomtest.xsl")
);
//使用Templates界面的newTransformer方法创建一个新的Transformer。
//Transformer的缺省实现实Xalan提供的org.apache.xalan.transformer.TransformerImpl
javax.xml.transform.Transformer transformer = oTemplates.newTransformer();
//使用Transformer进行转换。
transformer.transform
(
//创建一个StreamSource对象来读取atom.xml
new javax.xml.transform.stream.StreamSource(request.getRealPath("/")+"xslt"+File.separator+"atom.xml"),
//使用out作为输出writer创建一个StreamResult输出转换结果。
new javax.xml.transform.stream.StreamResult( out ));
%>
这个演示所使用的xslt文件和xml文件来自《XML Bible》。XML文件的内容为H与He的化学信息,而XSL文档的内容则是把这个XML文件转换为一个html的文档。这个JSP程序通过一个基本的Xalan的转换过程输出HTML文档。下面是这个JSP程序的运行结果在Mozilla0.8中显示的结果,后面是Tomcat启动时的输出信息,熟悉的朋友一定看出我去掉了jaxp.jar和parser.jar这两个文件。
XML源文件与XSL源文件以及JSP的源程序请点击各自的连接。
这个程序在Pwindows 98,Tomcat 3.21,mozilla0.8的环境下运行通过。
这个程序仅仅用来演示,在真正使用的时候是同这个程序中使用的编程方法不同的。在单线程的程序中,我们可以使用TransformerFactory中的newTransformer方法直接获取一个Transformer,这种方法比我们上面使用的方法节省一步。在多线程的情况下,我们可以和上面一样创建一个Templates对象,然后再每个线程中从Templates中获取Transformer。这样可以节省读取xslt文档的时间,大大加快程序运行的速度。下面的jsp程序就是为多线程进行了优化的程序。
<%@ page contentType="text/html; charset=GB2312"
import="java.io.File"
%> <%!
javax.xml.transform.Templates oTemplates = null;
javax.xml.transform.TransformerFactory oFactory =
javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.stream.StreamSource oInput = null;
%> <%
if( null == oTemplates )
{
oTemplates = oFactory.newTemplates(
new javax.xml.transform.stream.StreamSource("FILE:///D:/mytest/xslt/atomtest.xsl")
);
}
if( null == oInput )
{
oInput = new javax.xml.transform.stream.StreamSource(request.getRealPath("/")+"xslt"+File.separator+"atom.xml");
}
javax.xml.transform.Transformer transformer = oTemplates.newTransformer();
transformer.transform
(
oInput,
new javax.xml.transform.stream.StreamResult( out )
);
%>
这个程序在PWindows98,tomcat2.3.1,jdk1.2/1.3环境下调试通过。源程序可以从此下载。运行结果如下图。