采用xalan引擎时,流程和saxon差不多,不过它还是使用扩展函数来完成数据连接和查询的功能。
foo_sql_xalan_query.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:sql="org.apache.xalan.lib.sql.XConnection"
extension-element-prefixes="sql">
<xsl:param name="driver" select="'com.informix.jdbc.IfxDriver'"/>
<xsl:param name="database" select=
"'jdbc:informix-sqli://192.168.0.1:5000/testDB:INFORMIXSERVER=pcsnet;user=pcs;password=abc'"/>
<xsl:variable name="query">
select <xsl:value-of select="/query/columns"/> from <xsl:value-of select="/query/table"/>
</xsl:variable>
<xsl:template match="/">
<xsl:variable name="connection" select="sql:new($driver,$database)"/>
<HTML>
<HEAD>
Table of <xsl:value-of select="/query/table"/>
</HEAD>
<BODY>
<TABLE border="1">
<xsl:variable name="table" select='sql:query($connection, $query)'/>
<TR>
<xsl:for-each select="$table/sql/metadata/column-header">
<TH><xsl:value-of select="@column-label"/></TH>
</xsl:for-each>
</TR>
<xsl:apply-templates select="$table/sql/row-set"/>
<xsl:text>
</xsl:text>
</TABLE>
</BODY>
</HTML>
<xsl:variable name="close" select="sql:close($connection)"/>
</xsl:template>
<xsl:template match="row-set">
<xsl:apply-templates select="row"/>
</xsl:template>
<xsl:template match="row">
<TR>
<xsl:apply-templates select="col"/>
</TR>
</xsl:template>
<xsl:template match="col">
<TD>
<xsl:value-of select="text()"/>
</TD>
</xsl:template>
</xsl:stylesheet>
saxon和xalan都是通过jdbc连接数据库的,所以读者如果手头没有informix,只要更换不同的数据库驱动,以及对应的数据库连接参数,就可以在自己的机器上检验效果了。
以上的这些案例只是揭开了XSLT扩展的神秘面纱,至于怎么去发掘它的潜力,就留给富有创造力的读者去完成吧。
参考资料
1. 关于saxon 的相关资料,请参阅Saxonic(http://www.saxonica.com)
2. 关于xalan 的相关资料,请参阅 Apache.org (http://xml.apache.org/xalan-j)
3. 关于在xalan中增加对于javascript的支持,请参阅Bean Scripting Framework (http://jakarta.apache.org/bsf/index.html) 和 Rhino (http://www.mozilla.org/rhino)
4. 关于XSLT的相关资料,请参阅W3C.org(http://www.w3.org/Style/XSL/)
5. 程序清单下载:samplecode.rar
关于作者
马晨是上海浦东发展银行温州支行的软件开发专家。自 2000 年来已经在多个平台上开发过不同的应用。目前的工作方向主要侧重于基于 xml 和 javascript 的应用开发。在业余时间喜欢各种运动,尤其喜欢和朋友在周末打打羽毛球。你可以通过电子邮件(pearma@gmail.com)和他联系。
