用XSLT 2.0生成PHP
http://tech.ddvip.com 2007年10月25日 社区交流
内容摘要:这是由两部分组成的关于 XSLT 的系列文章的第 2 部分,Jack Herrington 将介绍如何扩展第 1 部分中建立的 XSLT 2.0 代码生成器,以便生成代码的 PHP 部分,为 Web 服务器提供数据库访问。
<!-- PHP: Module tag handler -->
<xsl:template match="module" mode="php">
<xsl:result-document href="php/{@name}.php">
<script language="php">
<xsl:apply-templates select="*" mode="php" />
</script>
</xsl:result-document>
</xsl:template>
注意,该模板使用 xsl:result-document 标签为每个模块创建新文件,然后通过 xsl:apply-templates 标签将代码填写到文件中。
为了完成 insert 方法的实现部分,我使用了清单 10 所示的模板。
清单 10. SQL Insert 模板
<!-- PHP: SQL Insert tag handler -->
<xsl:template match="insert" mode="php">
<xsl:call-template name="php-db-function">
<xsl:with-param name="content">
<xsl:call-template name="php-sql-command">
<xsl:with-param name="command" select="gen:build-insert(.)" />
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
另一个重要的调用是 build-insert 函数。清单 11 显示了该函数的代码。
清单 11. insert 命令构造器
<!-- Builds an SQL insert command -->
<xsl:function name="gen:build-insert">
<xsl:param name="query" />
<xsl:variable name="out">
<sql>
<query>
INSERT INTO <xsl:value-of select="$query/@table" />
(
<xsl:for-each select="$query/field"><xsl:if test="position() > 1">,
</xsl:if><xsl:value-of select="@name" /></xsl:for-each>
) VALUES (
<xsl:for-each select="$query/field"><xsl:if test="position() > 1">,
</xsl:if>?</xsl:for-each>
)
</query>
<inputs>
<xsl:for-each select="$query/field">
<input name="{@name}" />
</xsl:for-each>
</inputs>
</sql>
</xsl:variable>
<xsl:sequence select="$out" />
</xsl:function>
来源:ibm 作者:Jack Herrington 责编:豆豆技术应用