和荣笔记 - XSL-FO 与 XHTML
========
杨和荣
版本 2.01,修改于2002年12月23日
XSL-FO 简介
========
什么是 XSL-FO?
--------
XSL-FO:一种建立在 XML 基础之上的附加排版语言。它的工作原理是在原始文字资料之中
加入 XML 语句,其作用是控制原始文字资料的排版格式。XSL-FO 其实和 TeX 非常相似,而 TeX
在十五年以前就广泛用于各种科技文献排版之中。
XSL-FO 主要特点:
- XSL-FO 采用 XML 语言格式。
- XSL-FO 也可以和 XSL 转换语言结合使用,对被处理的 XML 文件产生两种效果:
一,内容转换;二,打印排版。
“世界你好!”实例
--------
下面是我的第一个 XSL-FO 实例,hello.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" margin="0.5in"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="my_page"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hello world!</fo:block> </fo:flow> </fo:page-sequence></fo:root>
请注意:
- 这是一个完整的 XML 文件,其根元素名称为“fo:root”。
- 文中所有元素的名称都有“fo:”前坠,代表 XML 名称空间:“ http://www.w3.org/1999/XSL/Format”。
有了 XSL-FO 文件后的下一个问题是用什么软件来处理这样的文件。为此我作了一些调查和测试:
- 我没有什么方法可以用 MS Internet Explorer 6.0 显示 XSL-FO 文件。
- XML Spy 可以用来编辑 XSL-FO 文件,但是我不知道怎样用它显示 XSL-FO 文件。
- 我在网络上查找一番之后,发现了 FOP。试用效果不错,而且能直接生成 PDF 文件。
安装 FOP
--------
经过初步调查,我发现 FOP (Formatting Objects Processor) 似乎是现在最常用的 XSL-FO
处理软件。下面是安装 FOP 的步骤:
1。到 http://xml.apache.org/dist/fop/ 提取 fop-0.20.5rc2-bin.tar.gz
2。用 WinZIP 将 fop-0.20.5rc2-bin.tar.gz 解包,把内容放入 /local/fop-0.20.5rc2
3。建立一份指令文件,run_fop.bat:
/local/j2sdk1.4.1_01/bin/java -cp /local/fop-0.20.5rc2/build/fop.jar; /local/fop-0.20.5rc2/lib/xercesImpl-2.2.1.jar; /local/fop-0.20.5rc2/lib/xalan-2.4.1.jar; /local/fop-0.20.5rc2/lib/avalon-framework-cvs-20020806.jar; /local/fop-0.20.5rc2/lib/batik.jar org.apache.fop.apps.Fop %1 %2 %3 %4 %5 %6
注意,这是一条指令,必须写成一行,而且 .jar 文件名之间不能有空格。由于显示宽度的限制,
我不得不把这一条指令写成几行。
如果你在一个指令窗口中运行上述指令文件,得到下面的结果:
run_fopUSAGEFop [options] [-fo|-xml] infile [-xsl file] [-awt|-pdf|-mif|-pcl|-ps |-txt|-at|-print] <outfile> [OPTIONS] -d debug mode -x dump configuration settings -q quiet mode -c cfg.xml use additional configuration file cfg.xml -l lang the language to use for user information -s for area tree XML, down to block areas only...
你的安装便是成功的。
根据使用说明,FOP 有两个主要功能:
- 将 XSL-FO 文件排版生成 .txt,.pdf,或者 .ps 文件。
- 按照 XSLT 文件所给转换和排版语句,将 XML 文件转换并排版生成 .txt,.pdf,或者 .ps 文件。
将 XSL-FO 文件排版生成 .txt 文件
--------
首先让我们作一个简单的例子,将 hello.fo 排版生成一个 .txt 文件。请运行下面的指令:
run_fop -fo hello.fo -txt hello.txt
你会得到如下的信息:
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser[INFO] FOP 0.20.5rc2[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser[INFO] building formatting object tree[INFO] setting up fonts[INFO] rendering areas to TEXT[INFO] [1][INFO] Parsing of document complete, stopping renderer[INFO] writing out TEXT
从这些信息中,我们可以看出,FOP 使用了 Xerces SAXParser 来阅读 XSL-FO 文件。我们
还可以看出,排版后的结果只有一页。
为了验证结果,请将 hello.txt 文件用 notepad 打开,你会看到:
Hello world!...
排版结果完全正确。
将 XSL-FO 文件排版生成 .pdf 文件
--------
我们的第二个例子是将 hello.fo 排版生成一个 .pdf 文件。请运行下面的指令:
run_fop -fo hello.fo -pdf hello.pdf
你会得到如下的信息:
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser[INFO] FOP 0.20.5rc2[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser[INFO] building formatting object tree[INFO] setting up fonts[INFO] [1][INFO] Parsing of document complete, stopping renderer
然后请用 Adobe Reader 打开 hello.pdf,你会看到“Hello world!”被正确地排版在
页面的左上角。这个结果非常鼓舞人心,我对 FOP 的感觉越来越好了。
将 XML 文件转换排版生成 .pdf 文件
--------
在以上两个例子中,我们将原始文字资料已经和排版语句结合在一起了。在这个例子里,
我们将使用两个输入文件:一个是原始文字资料文件 hello_xsl.xml,一个是转换和排版
语句文件 hello_fo.xls。
hello_xsl.xml:
<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="hello.xsl"?><p>Hello world!</p>hello_fo.xsl:<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform"> <xsl:template match="p"><fo:root xmlns:fo=" http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="my_page" margin="0.5in"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="my_page"> <fo:flow flow-name="xsl-region-body"> <fo:block> -<xsl:value-of select="."/>- </fo:block> </fo:flow> </fo:page-sequence></fo:root> </xsl:template></xsl:stylesheet>
请注意:
- 排版指令“fo:*”被嵌入在转换指令“xsl:*”之中。
- 转换指令除了引入了排版指令以外,还将原文字资料作了简单的转换,在其首尾各加了
一字符:“-”。
现在请运行下面的指令:
run_fop -xml hello_xsl.xml -xsl hello_fo.xsl -pdf hello.pdf
如果你打开 hello.pdf,转换后的文字资料“-Hello world!-”被正确的排版在页面的左上角。
XML 文件的转换处理
--------
在 FOP 软件包里,还有一个 XML 文件处理软件:“xalan”。
它的功能是对 XML 文件作转换处理。下面是 xalan 的运行指令文件,run_xalan.bat:
/local/j2sdk1.4.1_01/bin/java -cp /local/fop-0.20.5rc2/lib/xercesImpl-2.2.1.jar; /local/fop-0.20.5rc2/lib/xalan-2.4.1.jar org.apache.xalan.xslt.Process %1 %2 %3 %4 %5 %6
让我们借用上面最后一个例子来试验,使用 xalan,安照 hello_fo.xml 来转换 hello_xsl.xml:
run_xalan -in hello_xsl.xml -xsl hello_fo.xsl -out hello.out
下面是转换后的结果 hello.out:
<?xml version="1.0" encoding="UTF-8"?><fo:root xmlns:fo=" http://www.w3.org/1999/XSL/Format"> <fo:layout... -Hello world!- </fo:block></fo:flow></fo:page-sequence></fo:root>
这个结果和我们的预计是一致的。排版语句被完整地保留下来了,原文字资料也被作过转换。
结论一:XML 文件用于组织原始文字资料,XSL 文件用于定义资料转换规则。如果需要,
转换规则内部还可以嵌入排版规则,用以控制资料的显示和打印。
结论二:FOP 软件可以用于资料转换处理,可以用于资料排版处理,还可以用于资料转换和
排版的一次性处理。
其它有关文章:
http://www.geocities.com/herong_yang
版权声明 本篇文章对您是否有帮助? 投票: 是 否 投票结果: 1 0
评论人:itjoe 参与分: 66 专家分: 0 发表时间: 2003-7-1 上午10:19
补充一点:
配置使用内嵌字体
配置中文字体
1. 制作font metric文件
a.如果是ttc类型的集合字库
java org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun" c:/winnt/fonts/simsun.ttc simsun.xml
注意大小写敏感。
b.如果是ttf类型的字体文件
java org.apache.fop.fonts.apps.TTFReader C:/WINNT/Fonts/msgothic.ttf
msgothic.xml
2. 配置userconfig.xml文件的font部分。
<font metrics-file="msgothic.xml" kerning="yes"
embed-file="C:/WINNT/Fonts/msgothic.ttf">
<font-triplet name="MSGothic" style="normal" weight="normal"/>
</font>
========
杨和荣
版本 2.01,修改于2002年12月23日
XSL-FO 简介
========
什么是 XSL-FO?
--------
XSL-FO:一种建立在 XML 基础之上的附加排版语言。它的工作原理是在原始文字资料之中
加入 XML 语句,其作用是控制原始文字资料的排版格式。XSL-FO 其实和 TeX 非常相似,而 TeX
在十五年以前就广泛用于各种科技文献排版之中。
XSL-FO 主要特点:
- XSL-FO 采用 XML 语言格式。
- XSL-FO 也可以和 XSL 转换语言结合使用,对被处理的 XML 文件产生两种效果:
一,内容转换;二,打印排版。
“世界你好!”实例
--------
下面是我的第一个 XSL-FO 实例,hello.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" margin="0.5in"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="my_page"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hello world!</fo:block> </fo:flow> </fo:page-sequence></fo:root>
请注意:
- 这是一个完整的 XML 文件,其根元素名称为“fo:root”。
- 文中所有元素的名称都有“fo:”前坠,代表 XML 名称空间:“ http://www.w3.org/1999/XSL/Format”。
有了 XSL-FO 文件后的下一个问题是用什么软件来处理这样的文件。为此我作了一些调查和测试:
- 我没有什么方法可以用 MS Internet Explorer 6.0 显示 XSL-FO 文件。
- XML Spy 可以用来编辑 XSL-FO 文件,但是我不知道怎样用它显示 XSL-FO 文件。
- 我在网络上查找一番之后,发现了 FOP。试用效果不错,而且能直接生成 PDF 文件。
安装 FOP
--------
经过初步调查,我发现 FOP (Formatting Objects Processor) 似乎是现在最常用的 XSL-FO
处理软件。下面是安装 FOP 的步骤:
1。到 http://xml.apache.org/dist/fop/ 提取 fop-0.20.5rc2-bin.tar.gz
2。用 WinZIP 将 fop-0.20.5rc2-bin.tar.gz 解包,把内容放入 /local/fop-0.20.5rc2
3。建立一份指令文件,run_fop.bat:
/local/j2sdk1.4.1_01/bin/java -cp /local/fop-0.20.5rc2/build/fop.jar; /local/fop-0.20.5rc2/lib/xercesImpl-2.2.1.jar; /local/fop-0.20.5rc2/lib/xalan-2.4.1.jar; /local/fop-0.20.5rc2/lib/avalon-framework-cvs-20020806.jar; /local/fop-0.20.5rc2/lib/batik.jar org.apache.fop.apps.Fop %1 %2 %3 %4 %5 %6
注意,这是一条指令,必须写成一行,而且 .jar 文件名之间不能有空格。由于显示宽度的限制,
我不得不把这一条指令写成几行。
如果你在一个指令窗口中运行上述指令文件,得到下面的结果:
run_fopUSAGEFop [options] [-fo|-xml] infile [-xsl file] [-awt|-pdf|-mif|-pcl|-ps |-txt|-at|-print] <outfile> [OPTIONS] -d debug mode -x dump configuration settings -q quiet mode -c cfg.xml use additional configuration file cfg.xml -l lang the language to use for user information -s for area tree XML, down to block areas only...
你的安装便是成功的。
根据使用说明,FOP 有两个主要功能:
- 将 XSL-FO 文件排版生成 .txt,.pdf,或者 .ps 文件。
- 按照 XSLT 文件所给转换和排版语句,将 XML 文件转换并排版生成 .txt,.pdf,或者 .ps 文件。
将 XSL-FO 文件排版生成 .txt 文件
--------
首先让我们作一个简单的例子,将 hello.fo 排版生成一个 .txt 文件。请运行下面的指令:
run_fop -fo hello.fo -txt hello.txt
你会得到如下的信息:
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser[INFO] FOP 0.20.5rc2[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser[INFO] building formatting object tree[INFO] setting up fonts[INFO] rendering areas to TEXT[INFO] [1][INFO] Parsing of document complete, stopping renderer[INFO] writing out TEXT
从这些信息中,我们可以看出,FOP 使用了 Xerces SAXParser 来阅读 XSL-FO 文件。我们
还可以看出,排版后的结果只有一页。
为了验证结果,请将 hello.txt 文件用 notepad 打开,你会看到:
Hello world!...
排版结果完全正确。
将 XSL-FO 文件排版生成 .pdf 文件
--------
我们的第二个例子是将 hello.fo 排版生成一个 .pdf 文件。请运行下面的指令:
run_fop -fo hello.fo -pdf hello.pdf
你会得到如下的信息:
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser[INFO] FOP 0.20.5rc2[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser[INFO] building formatting object tree[INFO] setting up fonts[INFO] [1][INFO] Parsing of document complete, stopping renderer
然后请用 Adobe Reader 打开 hello.pdf,你会看到“Hello world!”被正确地排版在
页面的左上角。这个结果非常鼓舞人心,我对 FOP 的感觉越来越好了。
将 XML 文件转换排版生成 .pdf 文件
--------
在以上两个例子中,我们将原始文字资料已经和排版语句结合在一起了。在这个例子里,
我们将使用两个输入文件:一个是原始文字资料文件 hello_xsl.xml,一个是转换和排版
语句文件 hello_fo.xls。
hello_xsl.xml:
<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="hello.xsl"?><p>Hello world!</p>hello_fo.xsl:<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform"> <xsl:template match="p"><fo:root xmlns:fo=" http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="my_page" margin="0.5in"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="my_page"> <fo:flow flow-name="xsl-region-body"> <fo:block> -<xsl:value-of select="."/>- </fo:block> </fo:flow> </fo:page-sequence></fo:root> </xsl:template></xsl:stylesheet>
请注意:
- 排版指令“fo:*”被嵌入在转换指令“xsl:*”之中。
- 转换指令除了引入了排版指令以外,还将原文字资料作了简单的转换,在其首尾各加了
一字符:“-”。
现在请运行下面的指令:
run_fop -xml hello_xsl.xml -xsl hello_fo.xsl -pdf hello.pdf
如果你打开 hello.pdf,转换后的文字资料“-Hello world!-”被正确的排版在页面的左上角。
XML 文件的转换处理
--------
在 FOP 软件包里,还有一个 XML 文件处理软件:“xalan”。
它的功能是对 XML 文件作转换处理。下面是 xalan 的运行指令文件,run_xalan.bat:
/local/j2sdk1.4.1_01/bin/java -cp /local/fop-0.20.5rc2/lib/xercesImpl-2.2.1.jar; /local/fop-0.20.5rc2/lib/xalan-2.4.1.jar org.apache.xalan.xslt.Process %1 %2 %3 %4 %5 %6
让我们借用上面最后一个例子来试验,使用 xalan,安照 hello_fo.xml 来转换 hello_xsl.xml:
run_xalan -in hello_xsl.xml -xsl hello_fo.xsl -out hello.out
下面是转换后的结果 hello.out:
<?xml version="1.0" encoding="UTF-8"?><fo:root xmlns:fo=" http://www.w3.org/1999/XSL/Format"> <fo:layout... -Hello world!- </fo:block></fo:flow></fo:page-sequence></fo:root>
这个结果和我们的预计是一致的。排版语句被完整地保留下来了,原文字资料也被作过转换。
结论一:XML 文件用于组织原始文字资料,XSL 文件用于定义资料转换规则。如果需要,
转换规则内部还可以嵌入排版规则,用以控制资料的显示和打印。
结论二:FOP 软件可以用于资料转换处理,可以用于资料排版处理,还可以用于资料转换和
排版的一次性处理。
其它有关文章:
http://www.geocities.com/herong_yang
版权声明 本篇文章对您是否有帮助? 投票: 是 否 投票结果: 1 0
评论人:itjoe 参与分: 66 专家分: 0 发表时间: 2003-7-1 上午10:19
补充一点:
配置使用内嵌字体
配置中文字体
1. 制作font metric文件
a.如果是ttc类型的集合字库
java org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun" c:/winnt/fonts/simsun.ttc simsun.xml
注意大小写敏感。
b.如果是ttf类型的字体文件
java org.apache.fop.fonts.apps.TTFReader C:/WINNT/Fonts/msgothic.ttf
msgothic.xml
2. 配置userconfig.xml文件的font部分。
<font metrics-file="msgothic.xml" kerning="yes"
embed-file="C:/WINNT/Fonts/msgothic.ttf">
<font-triplet name="MSGothic" style="normal" weight="normal"/>
</font>