java 对 xslt 的扩展。
1 目前主流的Transformer的实现
Java sdk要求XSLT的transformer实现javax.xml.transform.TransformerFactory抽象类中的抽象方法。该工厂类成为具体的Transformer实例创建的入口。目前主流的实现在www.jdom.org/docs/apidocs/org/jdom2/transform/XSLTransformer.html的网页上可以得到以下的XSLTprocessers:
Saxon 6.x: com.icl.saxon.TransformerFactoryImpl
Saxon 7.x: net.sf.saxon.TransformerFactoryImpl
Xalan: org.apache.xalan.processor.TransformerFactoryImpl
jd.xslt: jd.xml.xslt.trax.TransformerFactoryImpl
Oracle: oracle.xml.jaxp.JXSAXTransformerFactory
此外在打开j2se sdk 的javax.xml.transform.TransformerFactory.java 文件后,看finder函数,会发现j2se调用的是com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.
在上面说的那个api网页上介绍了使用这些入口的方法。可以通过以下步骤实现:
1, 调用System.setProperty(“javax.xml.transform.TransformerFactory”,”classname”)
2, 通过设置命令行参数:-Djavax.xml.transform.TransformerFactory=classname.
3, 进入到JRE路径下修改lib/jaxp.properties文件,添加下面一行文字
javax.xml.parsers.DocumentBuilderFacotry=classname
4, 在META-INF/services/目录下命名一个javax.xml.transform.TransformerFactory的文件。编辑这个文件,配置所需的Transformer包
5, 最后你也可以什么都不配,用jdk自带的Transformer。从Sun的JDK1.4开始,jdk内置的Transformer就是Xalan。JDK1.4的是Xalan2.2d10。
2 Transformer的使用
1, 创建xslFile的StreamSource。StreamSource类将一个xsl文件/数据对象封装成一个向Transformer提供转换规则的数据源。通过使用这个数据源Tansformer可以实例化一个转换处理的入口。
2, 构建输入和输入的对象。输入和输出的对象都是StreamResult类的实例。
3, 调用Transformer的transform方法,实现数据转换。
示例代码如下:
TransformerFactoryfactory = TransformerFactory.newInstance();
StreamResultinput = new StreamResult(xmlReader);
StreamResultresult = new StreamResult(outWriter);
factory.newTransformer(newStreamSource(xslFile)).transform(input, result);
TransformerFactory
StreamSource
Transformer
StreamResult
StreamResult
3 Java 对xslt的扩展
目前我只研究了java原始接口的xslt扩展。而其他Transformer processor的java扩展方式我没做具体的测试研究。
3.1 通过Java sdk对xslt扩展
先看下面的代码:
可以看到,在定义template的时候,通过定义命名空间,将java的java.util.Date类引入进来,并且绑定到一个xmlns上,命名成date。然后通过定义变量,将Date实例化,并且绑定到变量now上。最后将当前的小时数通过形式:now:getHours($now)输出出来。这其中包括下面几个使用模式:
1, 通过xmlns将类与命名空间绑定xmlns:xxx=”xxx.xxx.xxxx”;
2, 调用类的初始化函数:xxx:new()。xxx是在1中绑定了具体类的命名空间。
3, 类内的方法调用:xxx:mmm($ppp,….);
a) xxx是绑定了具体java类的命名空间的名字。(与2中的形式一样。)
b) 如果第二部使用变量将变量绑定了一个类的实例化后的对象。那么ppp就是这个变量的名字。这与xslt的变量使用是一样的。
c) $ppp后面是调用时,提供给方法的参数序列。
在使用上面的开发模式时,java.util.Date可以换成自己的类,实现自己想要达到的功能。