java 对 xslt 的扩张

java 对 xslt 的扩展。1目前主流的Transformer的实现Java sdk要求XSLT的transformer实现javax.xml.transfor

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.TransformerFactoryImplSaxon 7.x: net.sf.saxon.TransformerFactoryImplXalan: org.apache.xalan.processor.TransformerFactoryImpljd.xslt: jd.xml.xslt.trax.TransformerFactoryImplOracle: 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
    <xml Source>

    Transformer
    <Object>

    StreamResult
    <input>

    StreamResult
    <result>

    3     Java 对xslt的扩展

    目前我只研究了java原始接口的xslt扩展。而其他Transformer processor的java扩展方式我没做具体的测试研究。

    3.1   通过Java sdk对xslt扩展

    先看下面的代码:

    <xsl:templatename="nowHour" xmlns:date="java.util.Date">

             <xsl:variablename="now" select="date:new()"/>

             <xsl:value-ofselect="now:getHours($now)"/>

    </xsl:template>

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