用XSLT 2.0生成PHP

在两部分组成的关于 XSLT 的系列文章的第一期中,介绍了 XSLT 2.0 的一些新特性,并说明了如何从抽象数据模型生成代码。为了示范这一过程,我建立了项目,开发一个健壮的代码生成器,为数据库服务器生成 SQL,并为 Web 服务器生成用于访问数据库的 PHP。我使用多层转换通过 XSL 构建 SQL。首先将抽象模型转化成数据库物理模式模型,然后使用该模式模型构建 SQL 代码。

接下来就要构建代码模型并从这个模型生成 PHP。在结束项目时,您将拥有系统的抽象模型、构建数据库的 SQL 代码和用于每个表的 PHP 包装器。但是在深入讨论 PHP 生成之前,我想首先回顾一下影响 XSL 模板设计及使用的 XSL 和 XSLT 2.0 的新特性。

对 XSL 模板的增强

要生成成功的代码则需要对目标语言(这里是 PHP)和代码生成语言(该例中即 XSLT)有充分的了解。第 1 部分的重点放在代码生成的基本原理上。本文对代码生成等式中的 XSL 一端进行了更深入的分析。

从本质上说,XSLT 是一种模板化的语言。它接受 XML 作为输入,然后使用一组模板将 XML 转化成 XML、HTML 或文本。生成器是相关模板的集合,使用两种模式 —— XML 模式和 Text 模式 —— 将原来输入的 XML 转化成代码。位于抽象模型和代码模板之间的中间模型使用 XML 模式,生成 PHP 和 SQL 的代码模板则使用文本模式。

这个代码生成系统使用 Saxon XSLT 引擎和一组自定义模板。为了方便起见,这些模板和输入放在同一个目录中。模板输出分别放到 PHP 和 SQL 代码目录中。不需要对 Saxon 作专门的扩展,虽然如果发现基本安装所提供的 XSL 标签或 XPath 函数不敷使用,那么可以用 Java? 扩展模板引擎。

XSL 模板的入口是与输入 XML 的根节点匹配的 XSL 模板。在 XSL 引擎启动时,它将输入 XML 应用于模板库。如果有与根节点(/)匹配的特殊模板,则首先执行它。下面是生成器中的主模板标签:

<xsl:template match="/">

这个匹配系统很重要,因为 XSL 要查看应用于当前正在处理节点的可用模板的列表,然后应用最匹配的模板。看一下清单 1 中的代码,这是上一期文章中的一个例子。

清单 1. 带有模式类型的模板

<xsl:template match="create" mode="sql">
DROP TABLE IF EXISTS <xsl:value-of select="@name" />;
CREATE <xsl:value-of select="@name" /> (
<xsl:apply-templates mode="sql" select="field" />
PRIMARY KEY ( <xsl:value-of select="@primary-key" /> )
     );
</xsl:template>

代码告诉 XSL 这个模板应用于 create 标签。因此,当 XSL 遇到 create 标签时,它就会执行该模板。此外,还要注意该模板指定了模式。需要像清单 2 那样在 xsl:apply-templates 标签中指定模式。

清单 2. 应用模板的标签

<xsl:apply-templates mode="sql" select="$sql-model/sql" />

XSL 中的模式

模式是 XSL 的一个重要概念。因为内存中可能同时有多个 XML 分层结构,需要有一种方法对特定分层结构应用一组特殊的模板,或者可用于单个 XML 源的一组转换。于是就引入了模式。这个代码生成器中有一组模板以 PHP 作为模式,另一组则用 SQL 作为模式。通过使用模式将这两种语言的模板逻辑区分开来。

xsl:apply-templates 标签告诉 XSL 将可以用的模板应用于 XML 模型中 select 标签所指定的那一部分。此外,还规定了模式 sql,因此 XSL 只寻找那些采用 sql 模式的模板。这是一种方便的模板名称空间机制。

时间: 2024-08-03 13:20:48

用XSLT 2.0生成PHP的相关文章

用XSLT 2.0生成SQL

假定您是一名新的 PHP 项目的工程团队主管,并且要求必备的条件都已满足,初步的数据模型包括大约 150 个表.现在该考虑一下进度表了.估计您每天能编写一个数据库访问类并完成其单元测试,因此,150 个表要用 150 天的时间.假设每个月工作 20 天,是不是要用将近八个月的时间来编写数据库访问层? 这样做可能不行,需要有一种方法来缩短所需的时间.您可以使用持久性框架,但即使这种框架能够把时间减半,仍然还需要四个月的时间.您还可以编写通用的类库,但是这样的库使用起来复杂不说,而且还非常容易出错,

用XSLT 2.0成批处理XML

大多数人都希望 Saxon 这样的 XSLT 处理程序能使用多个输入文件.常常会遇到这样的问题,需要将一个目录中的 XML 文件转换成 HTML.可以对这些文件分别使用 Saxon,但是如果最后希望生成一个文件包含所有那些 HTML 文件的索引,那该怎么办呢? 您需要的是目录列表的 XML 版本.这样就可以将这个 XML 文件作为 XSLT 的惟一输入文件,并用 XSLT 处理每个文件.如果 XSLT 能够直接进行目录处理就很完美了.不幸的是,尽管 XSLT 很强大,特别是 XSLT 2.0,但

在 XSLT 2.0 中创建多个文件

创建 XSLT 的第一个版本有很大的局限性,只能有一个输入和一个输出(虽然可以有多个模板文件).该标准的第 2 版仍然要求一个输入,但是输出系统更加灵活了.现在可以使用 xsl:result-document 指令产生多个输出文件.这一新的标签有两个重要属性,如表 1 所示. 表 1. xsl:result-document 属性 属性 说明 href 输出文件的文件名或者完全限定的 URL format 使用的格式名,如对应 xsl:output 指令中所定义的 为了试验该指令,我设计了一个输

图像处理-cmake编译的opencv3.0.0生成的工程无法通过编译

问题描述 cmake编译的opencv3.0.0生成的工程无法通过编译 我在windows下用cmake-gui编译opencv3.0(联合opencv contrib master), 生成的工程Opencv.sln在build的时候出现了许多下列类似的错误: 请问这是什么原因呢? 系统是windows10,vs2013 解决方案 http://www.opencv.org.cn/archiver/?tid-35547.html 解决方案二: http://www.nmtree.net/201

配置-opencv3.0.0生成成功 但是vs2013intellisense报100个错误

问题描述 opencv3.0.0生成成功 但是vs2013intellisense报100个错误 opencv3.0.0生成成功,测试图片运行时也能正常显示,但是vs2013环境下intellisense会提示100个莫名其妙的错误,如果新建新项目同样是会报100个与下列错误一样的错误,同样可以生成成功,也可以运行,到底是什么原因呢?**** 编程环境为win7 64位专业版+opencv3.0.0+visual studio2013 Intellisense100个错误如下所示:**** op

zximg怎么用-zxing3.0生成二维码怎么用

问题描述 zxing3.0生成二维码怎么用 2.2版本的代码放到3.0之后就不能用了,求解释,给我发个代码也行,谢谢 解决方案 http://ask.csdn.net/questions/163257 解决方案二: ZXing二维码生成ZXing 为Android应用生成二维码关于使用Zxing生成二维码的一些调整

实例-xp系统下用vc6.0生成word,执行CreateDispatch()失败,请大神帮忙看看

问题描述 xp系统下用vc6.0生成word,执行CreateDispatch()失败,请大神帮忙看看 执行到CreateDispatch(_T("Word.Application")函数就推出程序了,调用createdispatch函数失败 ,在InitInstance()函数中已经执行初始化,代码如下if(CoInitialize(NULL)!=S_OK) { AfxMessageBox("初始化COM组件失败!"); return FALSE; } 执行文件中

使用XSLT作为语言编译器-使用XSLT从XML生成PostScript

简介:探究使用 XSLT 作为编程语言编译器(尤其是在 PostScript 之前创建 XML 层)从 XML 文档生成 PostScript 文件的概念.本文将介绍样式表作为隐式语言定义的概念.PostScript 的基础知识以及创建 XML 到 PostScript 的编译器时涉及到的抽象层. 使用 XSLT 作为编译器 使用 XSLT 可以将 XML 数据转换成任意的其他数据格式.通常 XSLT 被视为 XML 到 XML 的转换语言,它以 XML 文档为输入并将其转换为其他 XML 结构

Step1数据系统技术(2.XML+XSLT的页面生成机制)

在本系统之中,网站的主体页面并不是通过普通的aspx返回方式返回的,而是采用一种XML+XSLT的形式,来自生成,这是我个人比较喜欢的方式,这种方式在这个系统之中有着更好的优势,我现在将优势列举几条: 1.完整的实现数据和表现形式的分离,数据完全在XML文件之中实现,而页面的表现的形式完全用XSLT实现,这样使程序的结构清晰简单,易于维护: 2.可以随意的选择将结果输出到文件或者Response: 3.XSLT可以自动的压缩HTML代码,生成紧凑,不易阅读而不影响浏览器解析的代码,你在XSLT文