Xalan支持使用Java扩展XSLT。而且使用Java扩展XSLT不需要其他类库支持,因此使用Java扩展XSLT是一个很方便的选择。 下面我们就来详细讨论使用Java扩展xsl的方法。另外从使用javascript扩展我们也看到,javascript扩展很难应用于多个xsl文件,而用java进行扩展就可以非常容易地实现。
在使用java进行xsl扩展地时候,我们需要写一个java类。在这个类里面定义一些public地方法,这些方法等同与javascript中地函数。例如下面地例子,我们定义了一个叫做A的类,这个类中有两个public的方法,一个叫做out,这个用来实现out扩展element,另一个方法叫做displaySex,这个方法用来实现扩展方法displaySex。下面是代码。
package a;
import org.apache.xalan.extensions.XSLProcessorContext;
import org.apache.xalan.templates.ElemExtensionCall;
import org.apache.xalan.templates.ElemTemplateElement;
public class A{
public String out( XSLProcessorContext xslProcContext , ElemExtensionCall elmExtCall){
org.apache.xalan.transformer.TransformerImpl oTrsfImpl =
xslProcContext.getTransformer();
org.w3c.dom.NodeList oList = elmExtCall.getChildNodes();
try{
for( int i = 0 ; i < oList.getLength() ; i ++ ){
((ElemTemplateElement)oList.item(i)).execute(oTrsfImpl);
}
}catch(Exception e){
e.printStackTrace();
}
return ",吃了吗?";
}
public String displaySex( String strSex){
if( strSex.equals("m") ) return "先生";
else if( strSex.equals("f") ) return "女士";
else return strSex;
}
}
相应的,我们要对xsl文件进行一些调整,调整后的结果可见下面的代码。我们仅仅修改了script标签中的内容,把javascript变成了javaclass然后再加上一个src的属性,这个属性指向了A类,由于A类是在a包中的,我们还要加上a.,另外还要有一个前缀“xalan://"看上去好像是一种新的因特网协议。呵呵。代码如下:
<?xml version="1.0" encoding="GB2312"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:my-ext="ext1" extension-element-prefixes="my-ext"> <xsl:output encoding="GB2312"/> <lxslt:component prefix="my-ext" elements="out" functions="displaySex"> <lxslt:script lang="javaclass" src="xalan://a.A"> </lxslt:script> </lxslt:component> <xsl:template match="person"> <results><my-ext:out><xsl:value-of select="."/><xsl:value-of select="my-ext:displaySex(@sex)"/>你好</my-ext:out></results> </xsl:template> </xsl:stylesheet>
本文介绍了如何使用Xalan库通过Java扩展XSLT。这种方法无需额外类库支持,使得扩展更为方便。文章详细讲解了创建Java类以定义XSLT中可调用的公共方法,并给出了一个名为A的示例类,包含out和displaySex两个方法。同时,文章展示了如何修改XSL文件,将javascript替换为javaclass并设置src属性引用Java类,以实现XSLT的Java扩展功能。
314

被折叠的 条评论
为什么被折叠?



