java xslt,java 对 xslt 的扩张

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可以换成自己的类,实现自己想要达到的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值