XMLTransform SQL函数使得应用程序开发人员能够不用第三方报表工具就直接从数据库产生高质量的格式化报表。
XMLTransform内嵌于SQL,因此它能够被任何能够连接到数据库并运行简单SQL语句的客户程序使用。
可扩展样式表语言(XSL)是指将一个XML文档转换成另外一种结构的XML的工具,它支持条件、XPath树遍历、循环和排序构造。XSL格式化对象(XSL-FO)也是一个XML应用程序,但是它支持各种高质量格式的文档的产生,比如说PDF、PostScript,甚至是GIF。
很多FO处理器是免费的,比如Apache FOP,而其它是内嵌于XML编辑器和处理器的。很多供应商开始推出WYSIVWYG编辑器来创建XSL-FO文件,这是必要的,因为XSL-FO可能会极度复杂。
下面给出一个非常简单的例子,首先假设我有一个XML文档:
<doc>Hello World</doc>
如果我需要使用“Hello World”以24-point大小的Arial字体产生一个PDF页面,我想要一个大概像下面这个样子的XSL-FO文档:
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page">
<fo:region-body margin="1in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:block font-family="Arial" font-size="24pt">Hello World</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
这大概是你所能够产生的最简单的XSL-FO文件了。如果我将其保存为“hello.fo”然后通过一个XSL-FO处理器运行它,我就可以产生这个文档的一个PDF或PostScript表示。
要从我的XML文档得到我的XSL-FO文档,我需要一个XSL样式表来完成文档之间的转换:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page">
<fo:region-body margin="1in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:block font-family="Arial" font-size="24pt">
<xsl:value-of select="/doc"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
XSLT处理器没有什么缺点,本文最关心的是内建于Oracle9iSQL产生我的XML文档,我可以使用:
select XMLElement("doc",'Hello World') from dual;
要使用SQL在数据库内部自动产生FO文档,我可以使用:
set long 1000000
select XMLTransform(
XMLElement("doc",'Hello World'),
XMLType(
'<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page">
<fo:region-body margin="1in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:block font-family="Arial" font-size="24pt">
<xsl:value-of select="/doc"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>')) result
from dual;
这里给出了使用SQL从数据库产生一个XSL-FO文档的最简单方法。在实际的环境中,你可以在一个WYSIWYG编辑器中从外部操纵XML和XSL-FO,将其保存到表中,然后从数据库产生一致的、高质量的报表。