例如,假设有一个与探险有关的杂志《业余探险家》。当首次刊出某篇文章时,它是按照网页的形式组织的,其导航信息在页眉或者页脚。为了方便,该文章甚至可能分解到多个网页中去。尽管这样作之后,在网络上浏览该文章就很方便了,但是《业余探险家》杂志社想把该文章收录到纸面版的杂志上却有些麻烦。你可以为这两篇内容相同的文章建立两个或者多个文档,但是用XSL-FO来把该文章的XML文档按照目的任意组织格式却方便的多。
想象一下网络板《业余探险家》中的某篇文章,文章所在网页应该会有许多链接和广告。该文章本身应该是像清单A中XML文档那样,是用扩展样式表语言转换(Extensible Stylesheet Language Transformations ,XSLT)组织该网页的。
尽管对管理网络板杂志的人们来说,这样作是最好不过了,但是处理杂志的纸面版的工作人员就没有这么好的运气了。这就是为什么我们使用XSL-FO的原因。XSL-FO的目标就是为打印而格式化XML,这与IBM公司的AFP为打印而格式化mainframe文件的目标有很大的相似之处。例如,XSF-LO可以格式化文本以产生适合11英寸×8.5英寸纸张的输出文件。一个如清单B所示的XSL文档,可以重新格式化清单A中的XML文档。
清单A中的XML文档以及清单B中XML文档作为XSLT引擎的输入。XSLT引擎产生如清单C所示的XSL-FO 文档。然后,该文档输入到XSL-FO格式化器,产生一个可打印文档。
这个方法听起来很酷,但它也不是白璧无瑕的。最显著的就是,对对大多数浏览器来说,XSL-FO仅仅是另一个XML文档而已。如果Web上没有某些其它工具,产生XSL-FO文档的整个过程都是毫无意义的。《业余探险家》杂志社为了获得文章的纸面格式,它需要一个FOP。FOP指得是PDF格式化对象处理器(Processor or Formatting Objects to PDF)——这两种称呼方式都可以。Apache Project产生一个很符合我可以接收价位的FOP:它是免费的。
在FOP的帮助下,清单C中的XSL-FO可以产生一个既可以在线浏览、又可用来打印的PDF文件。我建议在打印PDF文件之前,不妨在线仔细通览该文件——因为正确产生文档终究是一件令人愉快的事情。
尽管XSL-FO的W3C要求尚不十分牢固,但该技术可能让你免除许多烦杂的工作。当它与XSLT配合使用时,甚至可以免除从SQL数据库产生报告这一苦差事。