XSL与XSL-FO初探
1 前言
因为工作任务涉及到异构数据交换和展示,其中任务涉及到XML数据转换应用的XSLT和XSL-FO两个关键技术点,此文就将对XSL-FO技术初步的探索成果与大家分享如下.
2 XSL与XSL-FO的关系
XSL(EXtensible Stylesheet Language -扩展样式表语言)由两个主要部分组成:
● 用于转换 XML 文档的语言
● 用于指定格式化语义的 XML 词汇表
在这里,SytleSheet中的样式化(Styling)包含了两个含义,一个是转换信息,一个是格式化信息.
XSL的第一个部分是XSLT,第二个部分是XSL-FO(即XML SytlesSheet Language-Formatting Objects) ,目前通常也称为XSL(注意:这个通称与扩展样式表语言名称相同,不要混淆).
XSLT 通过将带标记的数据转换成美观的文档来使 XML 文档可读。通过使用 XSLT 处理器,应用定义在样式表中的规则来完成文档转换。这种方法需要一个 XML 文档作为源文件,需要另一个带格式化信息(样式表)的文档,还需要处理器。但是如果想使用 XML 而又不想对付两个文档,该怎么办呢?答案是:在文档中包含格式化信息。
XSL-FO提供了一组标记,可以用这些标记来定义文档如何显示给用户,使用FO,可以定义页面布局,字体风格,颜色,图像显示和许多其他设计特性.
XSL-FO文档存储在以.fo或.fob为后缀的文件中,其实也可以以.XML为后缀存储.
FO 文件由以下各部分组成:
柿子汁
● 一个 XML 头和名称空间声明
● 页面布局信息
● 页眉和页脚内容
● 文本内容
● 结束标记
关于XSL-FO规范格式,可以阅读 400 多页的 W3C XSL-FO 规范规范文档,链接如下:www.w3/TR/xsl/
目前,仅有少量的可选替代方法可以使 XSL-FO 文件有用。将 FO 文件转换成可读格式的最好选项是:
● PDF格式
● RTF格式
● HTML格式
● OOXML Word格式
3 XSLT与XSL-FO的区别
XSLT是指的XSL Transformation,专门用于进行XML数据转换(Data Transformation)。
XSL(EXtensible Stylesheet Language)是XSLT的前身,本来包含了XML数据表达(data prentation)和数据转换两个目的。由于两个目的截然不同,数据转换部分就逐渐从中独立出来成为一个新的建议(XSLT, W3C Recommendation 16 November 1999)。剩下的数据表达部分成为XSL-FO, XSL Formatting Object,目前还是草案。现在称XSL有人指XSLT,有的人指XSL-FO,所以要区分清楚。
在原来的一篇专家网文章《利用XML+XLST+XMLSchema实现数据交换》中曾介绍过通过XSLT对纯数据的XML进行数据交换的应用。常见的场景如下图,通过输入一个XML文件,通过XSLT文件进行转换,生成另外一个新的XML文件,其中设计到一些简单的函数以及语法。
其中一个很重要的标准-XHTML(eXtensible HyperText Markup Language,可扩展超文本置标语言)通过将纯数据XML通过XLST文件输出成XHTML标准格式的网页文件实现基本的HTML数据展示。
而XSL-FO是数据和格式混合的文件,而这个文件是通过XSLT格式将XML数据文件转换为XSL-FO元素构成的文件,然后通过某种显示引擎将fo文件转换成某种显示文件。
4 XSL-FO文件的生成
XSL-FO文件生成有三种方式
1. 在对XSL-FO规范了解的基础上,通过代码解析XML文档,对应生成输出fo文件
2. 通过XSL样式文件来完成文档之间的转换
3. 通过可视化工具自动生成对应输出fo文件,推荐使用Altova StyleVision 2011
例如,例子XML文档内容如下:
<doc>第一个fo PDF </doc>
● 通过代码生成最基本的fo文件
string s = "Hello World";
StringBuilder sb = new StringBuilder();
sb.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.Append("<fo:root xmlns:fo=\"www.w3/1999/XSL/Format\">");
sb.Append("<fo:layout-master-t>");
sb.Append("<fo:simple-page-master master-name=\"my-page\">");
sb.Append("<fo:region-body margin=\"1in\"/>");
sb.Append("</fo:simple-page-master>"奥林匹克会歌);
sb.Append("</fo:layout-master-t>");
sb.Append("<fo:page-quence master-reference=\"my-page\">");
sb.Append("<fo:flow flow-name=\"xsl-region-body\">");
sb二哈多少钱一只.Append("<fo:block font-family=\"Arial\" font-size=\"24pt\">" + s + "</fo:block>");
sb.Append("</fo:flow>");
sb.Append("</fo:page-quence> ");
sb.Append("</fo:root> ");
然后将字符串保存为FirstDemo.fo文件。
● 通过XSL样式文件进行转换
XSL文件大概如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="www.w3/1999/XSL/Transform">
<xsl:template match="/">
<fo:root xmlns:fo="www.w3/1999/XSL/Format">
<fo:layout-master-t>
<fo:simple-page-master master-name="my-page">
<fo:region-body margin="1in"/>
</fo:simple-page-master>
</fo:layout-master-t>
<fo:page-quence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:block font-family="Arial" font-size="24pt">
<xsl:value-of lect="/doc"/>
</fo:block>
搞笑句子 </fo:flow>
</fo:page-quence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
然后通过 的XslTransform类进行转换 ,代码如下:
XslTransform myXslTransform;无法拒绝的辞职理由
//读取XML文件
XPathDocument myXPathDocument = new XPathDocument("firstDemo.xml");
myXslTransform = new XslTransform();
//加载Xsl转换格式文件
myXslTransform.Load("firstDemo.xsl");
XmlTextWriter writer = new XmlTextWriter(古今"firstDemo.fo", System.Text.Encoding.UTF8);
//转换
myXslTransform.Transform(myXPathDocument, null, writer);
青花瓷歌词 writer.Flush();
writer.Clo();
System.IO.StringWriter stWrite = new System.IO.StringWriter呼兰河传的好句();
myXslTransform.Transform(myXPathDocument, null, stWrite);
5 XSL-FO文件的输出
通过各种方式生成了XSL-fo文件后,最后要做的是生成可以打印和预览的文件,可选择的格式有常用的HTML,PDF和RTF.
这时候就需要通过XSL-Fo Processor处理器来讲fo文件转换输出成选定格式的文件了.
目前最常用的是Apache软件基金会提供的开源的Apache FOP项目,所支持的格式有PDF,PS,PCL,AFP,XML(区域树),Print,AWT,PNG,RTF,TXT.