使用Xalan进行XSLT程序设计

--使用Java扩展XSL


  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支持使用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>