1、Cocoon介绍
根据Apache官方定义,Cocoon是一项XML发布框架。它允许你定义XML文档和文档的转换,并最终生成你所选择的表示形式,例如HTML, PDF, SVG, VRML等等。另外,Cocoon使你能够在XML文件中加入处理逻辑,从而是XML管 道具备动态的特性。
2、下载和安装
从 http://xml.apache.org/下载cocoon的最新版本,本文以2.1.6版本为例。解压将部署包部署到应用服务器,本文以tomcat为例。访问 http://loclahost:8080/cocoon/ 看是否出现欢迎界面。
3、hello,cocoon
在Cocoon安装配置完成以后,可以运行一些系统提供的例程,也可以自己制作XSP程序。本文提供一个简单的程序供参考。
3.1 文件说明
程序名:hello.xsp
转换文件:hello.xsl
3.2 文件清单
3.2.1 hello.xsp
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- XML文件头 -->
<!-- 使用Cocoon XSP Processor处理此页面 -->
<?cocoon-process type="xsp"?>
<!-- <xsp:page>展开XSP的页面 -->
<xsp:page
language="java"
xmlns:xsp="http://apache.org/xsp"
>
<!-- <xsp:logic>标记定义了业务逻辑 -->
<xsp:logic>
String Hello = "Hello, XSP!";
</xsp:logic>
<!-- 输出 -->
<page>
<xsp:expr>Hello</xsp:expr>
</page>
</xsp:page>
3.2.2 hello.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- XML文件头 -->
<!-- www.sawin.com.cn Blueski制作 -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--针对所有标记-->
<xsl:template match="/">
<html>
<body bgcolor="#ffcccc">
<p align="center"><br/><br/><b>
<font size="5" color="navy">
<!--取出<page>标记中的值,进行输出-->
<xsl:value-of select="page" />
</font></b>
</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSL样式单可以将XML文档进行转换,并输出为指定的样式。
3.3 发布前的配置
首先可将hello.xsp和hello.xsl文件被放在{TOMCAT_HOME}/webapps/cocoon/hello目录中。
此后,需要在sitemap.xmap中进行相应的配置。添加到 <map:pipelines>-><map:pipeline>下面
<!-- ================ MyHello =================== -->
<map:match pattern="hello/*">
<map:generate type="serverpages" src="hello/{1}.xsp"/>
<map:transform src="hello/hello.xsl"/>
<map:serialize/>
</map:match>
根据以上的配置,指定了样式单为hello/hello.xsl,并且只要在URL中输入http://localhost:8080/cocoon/hello/hello即可执行hello/hello.xsp文件,并将结果送到浏览器中。同样的,如果该目录下有hello2.xsp,则可通过http://localhost:8080/cocoon/hello/hello2进行调用。
需要注意的是,修改sitemap.xmap后你需要重新启动Tomcat或Resin才能使修改生效,否则你也可以试着修改cocoon.xconf文件中的sitemap标记中的check-reload属性,例如:
<sitemap file="sitemap.xmap" reload-method="asynchron" check-reload="yes" logger="sitemap"/>
这样,当sitemap.xmap修改后,系统将自动发现sitemap的改变并重新将其载入。
4、 从XML到HTML和PDF
4.1、创建XML示例文档
我们使用简单的XML文件做为数据源。以后你可能会使用实际的XML或者数据库等作为数据源。
test.xml的内容:
<?xml version="1.0" encoding="iso-8859-1"?>
<page>
<title>This is the test.xml example</title>
<s1 title="Section one">
<p>This is the text of section one</p>
</s1>
</page>
4.2、创建用来生成HTML的XSLT
在Cocoon里常用的生成HTML的方法就是使用XSLT来选择并且转换输入文档的适当的元素。
把下面这个 doc2html.xsl 拷贝到 html-pdf 目录下,使其和上面两个XML文档在一起。
doc2html.xsl 的内容:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- generate HTML skeleton on root element -->
<xsl:template match="/">
<html>
<head>
<title><xsl:apply-templates select="page/title"/></title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<!-- story is used later by the Meerkat example -->
<xsl:template match="p|story">
<p><xsl:apply-templates/></p>
</xsl:template>
<!-- convert sections to HTML headings -->
<xsl:template match="s1">
<h1><xsl:apply-templates select="@title"/></h1>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
4.3、创建站点地图
现在我们已经有了要发布的文档和用来将其转换成HTML的XSLT。接下来我们要做的就是在Cocoon管道里将其连接到一起,然后,站点地图就可以通过具体的请求来选择管道。
sitemap.xmap 文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
<map:components>
<map:generators default="file">
<map:generator name="file" src="org.apache.cocoon.generation.FileGenerator"/>
</map:generators>
<map:transformers default="xslt">
<map:transformer name="xslt" src="org.apache.cocoon.transformation.TraxTransformer"/>
</map:transformers>
<map:readers default="resource">
<map:reader name="resource" src="org.apache.cocoon.reading.ResourceReader"/>
</map:readers>
<map:serializers default="html">
<map:serializer name="xml" mime-type="text/xml" src="org.apache.cocoon.serialization.XMLSerializer"/>
<map:serializer name="html" mime-type="text/html" src="org.apache.cocoon.serialization.HTMLSerializer"/>
<map:serializer name="svg2png" src="org.apache.cocoon.serialization.SVGSerializer" mime-type="image/png"/>
<map:serializer name="fo2pdf" src="org.apache.cocoon.serialization.FOPSerializer" mime-type="application/pdf"/>
</map:serializers>
<map:matchers default="wildcard">
<map:matcher name="wildcard" src="org.apache.cocoon.matching.WildcardURIMatcher"/>
</map:matchers>
<map:pipes default="caching">
<map:pipe name="caching" src="org.apache.cocoon.components.pipeline.impl.CachingProcessingPipeline">
</map:pipe>
</map:pipes>
</map:components>
<map:pipelines>
<map:pipeline>
<map:match pattern="*.html">
<map:generate src="{1}.xml"/>
<map:transform src="doc2html.xsl"/>
<map:serialize type="html"/>
</map:match>
<!-- later, respond to *.pdf requests with
our docs processed by doc2pdf.xsl -->
<map:match pattern="*.pdf">
<map:generate src="{1}.xml"/>
<map:transform src="doc2pdf.xsl"/>
<map:serialize type="fo2pdf"/>
</map:match>
</map:pipeline>
</map:pipelines>
</map:sitemap>
上面文件中很重要的一点就是 <map:match>元素,他用来告诉 Cocoon 如何处理这里路径里的以.html结尾的请求。
4.4. 测试 HTML 发布
到这时,我们应该能看到HTML页面的结果了。
访问 http://localhost:8080/cocoon/test.html 页面会显示出大号字体的"Section one" 。
如果没有正常工作,您需要检测一下上面的各步骤,如果还找不到错误的原因的话,您可以到$TOMCAT/webapps/cocoon/WEB-INF/logs 目录查看Cocoon的日志。Cocoon的日志有多个文件,您只需要查看那个当错误发生时大小给变了的日志文件,从中找出线索。
上面的站点地图里已经包括了PDF发布的配置。但是这项功能此时并不能正常工作,因为我们还没有创建转换成PDF所需要的XSLT。
4.5、创建转换PDF用的XSLT
PDF文档是由XSL-FO文档(包含一些特定的页面描述词的XML文档)来生成的。由Cocoon 的 PDF 序列化器来完成实际的转化。
将下面的doc2pdf.xsl 拷贝到 html-pdf目录下:
doc2pdf.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
>
<!-- generate PDF page structure -->
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="page"
page-height="
29.7cm
"
page-width="
21cm
"
margin-top="
1cm
"
margin-bottom="
2cm
"
margin-left="
2.5cm
"
margin-right="
2.5cm
"
>
<fo:region-before extent="
3cm
"/>
<fo:region-body margin-top="
3cm
"/>
<fo:region-after extent="
1.5cm
"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="all">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference
master-reference="page" page-position="first"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="all">
<fo:flow flow-name="xsl-region-body">
<fo:block><xsl:apply-templates/></fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<!-- process paragraphs -->
<xsl:template match="p">
<fo:block><xsl:apply-templates/></fo:block>
</xsl:template>
<!-- convert sections to XSL-FO headings -->
<xsl:template match="s1">
<fo:block font-size="
24pt
" color="red" font-weight="bold">
<xsl:apply-templates select="@title"/>
</fo:block>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
因为这个文件在我们前面的站点地图中已经引用,所以我们不需要再在sitemap.xmap做任何配置了。
4.6、 测试 PDF 发布
这时我们应该能看到PDF的结果了。
访问 http://localhost:8080/cocoon/test.pdf 会显示大号字体红色的"Section one"。
到这里,您应该了解其实在Cocoon中发布HTML和PDF不是多难的事情。更为美妙的是当我们有大量的XML文档需要发布时,我们只需要编写两个XSLT文件来将其转换成特定的格式。而当我们需要改变发布文档的外观时,我们只需要修改那两个相应的XSLT。我们并不需要去接触那些源文档。