当前位置: 首页 > 工具软件 > Cocoon > 使用案例 >

Cocoon入门

山高峰
2023-12-01

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.xsphello.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后你需要重新启动TomcatResin才能使修改生效,否则你也可以试着修改cocoon.xconf文件中的sitemap标记中的check-reload属性,例如:
<sitemap file="sitemap.xmap" reload-method="asynchron" check-reload="yes" logger="sitemap"/>
这样,当sitemap.xmap修改后,系统将自动发现sitemap的改变并重新将其载入。

4、 XMLHTMLPDF

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、创建用来生成HTMLXSLT
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、创建站点地图

现在我们已经有了要发布的文档和用来将其转换成HTMLXSLT。接下来我们要做的就是在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中发布HTMLPDF不是多难的事情。更为美妙的是当我们有大量的XML文档需要发布时,我们只需要编写两个XSLT文件来将其转换成特定的格式。而当我们需要改变发布文档的外观时,我们只需要修改那两个相应的XSLT。我们并不需要去接触那些源文档。

 类似资料: