使用Xalan进行XSLT程序设计

--第一个使用Xalan的例子


  1. 什么时候需要进行XSLT程序设计
  2. 关于IE5和Mozilla的基本背景知识
  3. Tomcat和jdk1.3的配置
  4. 第一个使用Xalan的程序的例子
  5. 术语与背景知识
  6. 使用javascript及其他语言扩展XSL
  7. 使用java扩展XSL
  8. 使用Xalan的命令行工具
  9. 在Applet中使用Xalan
  10. 调试(debug)一个xslt文档
  11. XSLTC
  12. DTM

下面我们用一个例子来演示以下使用Xalan进行XSLT程序设计的最基本过程,这是一个最基本的JSP程序,简单到不可能在简单的地步了。我想通过这个程序来让大家了解Xalan进行XSLT是多么的简单。实话实说,尽管猛一看大家什么都不会,实际上进行XSLT程序设计并不难。在这个程序里面,所有的工作实际上可以仅仅用四步来完成。

  1. 使用javax.xml.transform.TransformerFactory的newInstance方法创建一个javax.xml.transform.TransformerFactory的实例。
  2. 使用javax.xml.transform.TransformerFactory中的newTemplates方法创建一个javax.xml.transform.Templates的实例。javax.xml.transform.Templates是一个界面,其实现与界面的提供者无关,可以通过设置来更改,在Xalan和sun提供的jaxp1.1中是由Xalan提供的。
  3. 使用javax.xml.transform.Templates的newTransformer方法创建一个javax.xml.transform.Transformer的实例。javax.xml.transform.Transformer同样是一个可以更改其实现的实例。(第二步和第三步在部分情况下可以合并,使用javax.xml.transform.TransformerFactory中的newTransformer方法来完成,具体我们会在后面讨论。)
  4. 使用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环境下调试通过。源程序可以从此下载。运行结果如下图。