1. 制作Docbook文档需è¦äº†(ji¨£n)解的知识åQ?/p>
1) XML - ˜q™æ˜¯æœ€åŸºæœ¬çš„,如果˜q™ä¸ªéƒ½ä¸æ‡‚çš„è¯ï¼Œæœ€å¥½å…ˆæ‰¾æœ¬å…¥é—¨¾U§çš„书看看;
2) DTD - æœ‰åŠ©äºŽä½ ç†è§£Docbook的结构;
3) XSL - 有助于定制自å·Þqš„DocbookåQ?br />4) XSL-FO - 最好了(ji¨£n)解一点,有助于更好的定制自己的PDF输出ã€?/p>
2. 制作Docbook文档的最½Ž€å•çš„˜q‡ç¨‹åŒ…括以下的æ¥éª¤ï¼š(x¨¬)
1) ¾~–辑XMLæ–‡äšg;
2) 对XMLæ–‡äšg˜q›è¡Œå¤„ç†åQŒç”ŸæˆHTML或者PDF文档ã€?/p>
2.1. ¾~–辑XMLæ–‡äšg
如果使用¾U¯æ–‡æœ¬ç¼–辑器æ¥å®Œæˆè¿™™å¹å·¥ä½œï¼Œæˆ‘敢打赌一天之åŽä½ ž®±åšä¸ä¸‹åŽÖMº†(ji¨£n)åQŒç›´æŽ¥ç¼–辑XML坿˜¯ä¸€ä»¶è‹¦å·®äº‹ã€‚ä‹É用类似XMLSPY˜q™æ ·çš„工典P¼Œæä¾›è‡ªåŠ¨å¡«å……åŠŸèƒ½åQŒåÆˆä¸”éšæ—¶å¯ä»¥è¿›è¡Œæœ‰æ•ˆæ€§æ£€æŸ¥ï¼Œä¸å®¹æ˜“出错,å¯ä»¥è®©å·¥ä½œè½»æ¾ä¸ž®‘ã€?/p>
Docbook文档分两¾c»ï¼š(x¨¬)书(bookåQ‰å’Œæ–‡ç« åQˆarticleåQ‰ã€‚articlež®±æ˜¯ä¸€èˆ¬çš„æ–‡ç« åQŒä¸åŒ…å«ç« (chapteråQ‰ï¼Œåªæœ‰èŠ? åQˆsectionåQ‰ã€‚book比较完整åQŒå¯ä»¥åŒ…å«å‰a€åQˆprefaceåQ‰ï¼Œéƒ¨åˆ†åQˆpartåQ‰ï¼Œç« (chapteråQ‰ï¼Œæ–‡ç« åQˆarticleåQ‰ç‰½{‰ã€‚ä»¥ä¸Šæ ˜q°çš„都是Docbook DTDå®šä¹‰çš„å…ƒç´ ï¼Œ˜q™é‡Œä¸å¯èƒ½ç»™å‡?gu¨®)™¯¦¾l†çš„说明åQŒå…·ä½“æ¯ä¸ªå…ƒç´ çš„¾l“æž„å‚è§Docbook DTDã€?/p>
让我们先æ¥çœ‹ä¸€ä¸ªbook¾cÕdž‹æ–‡æ¡£çš„典型定义:(x¨¬)
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) list 1. 典型的book¾cÕdž‹æ–‡æ¡£
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<book>
 (t¨©ng)<bookinfo>
 (t¨©ng) <title>My Book</title>
 (t¨©ng) <author>
 (t¨©ng) (t¨©ng) <firstname>My First Name</firstname>
 (t¨©ng) (t¨©ng) <surname>My Last Name</surname>
 (t¨©ng) </author>
 (t¨©ng) <publisher>
 (t¨©ng) (t¨©ng) <publishername>CSDN</publishername>
 (t¨©ng) </publisher>
 (t¨©ng) <isbn>ISBN#</isbn>
 (t¨©ng) <copyright>
 (t¨©ng) (t¨©ng) <year>2005</year>
 (t¨©ng) </copyright>
 (t¨©ng)</bookinfo>
 (t¨©ng)<part>
 (t¨©ng) <title>My Part</title>
 (t¨©ng) <chapter>
 (t¨©ng) (t¨©ng) <title>My Chapter</title>
 (t¨©ng) (t¨©ng) <sect1>
 (t¨©ng) (t¨©ng) (t¨©ng) <title>My Section1</title>
 (t¨©ng) (t¨©ng) (t¨©ng) <para>This (t¨©ng) is a demo of a book.</para>
 (t¨©ng) (t¨©ng) </sect1>
 (t¨©ng) </chapter>
 (t¨©ng)</part>
</book>
该文档声明ä‹É用的DTDä¸?a >http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtdåQ? 所有的内容都包å«åœ¨bookå…ƒç´ ä¸ï¼Œbookinfoå…ƒç´ åŒ…å«ä¹¦ååQˆtitleåQ‰ã€ä½œè€…(authoråQ‰ã€å‡ºç‰ˆç¤¾åQˆpublisheråQ‰ã€ä¹¦å? åQˆisbnåQ‰å’Œç‰ˆæƒåQˆcopyrightåQ‰ã€‚接ç€partå…ƒç´ åŒ…å«çš„内å®ÒŽ(gu¨©)˜¯è¯¥ä¹¦çš„ä¸€ä¸ªéƒ¨åˆ†ï¼Œä¸‹é¢æœ‰ä¸€ç« ï¼ŒæŽ¥ç€æœ‰ä¸€èŠ‚ï¼ˆsect1åQ‰ï¼Œå½“然都有å„è‡ªçš„æ ‡é¢˜ã€?/p>
æ€Žä¹ˆæ øP¼Œå„ä¸ªå…ƒç´ çš„å«ä¹‰æ˜¯ä¸æ˜¯å¾ˆæ˜¾è€Œæ˜“è§ï¼Œæ ÒŽ(gu¨©)®å…ƒç´ çš„å¿UŽÍ¼Œä½ 就能知é“自å·Þqš„内容该包å«åœ¨ä»€ä¹ˆå…ƒç´ 里é¢ã€?/p>
在上é¢çš„例å里é¢åQŒæœ‰äº›å…ƒç´ 䏿˜¯å¿…™åÈš„。è¬å¦‚bookinfoåQŒå¯ä»¥æ²¡æœ‰æˆ–者有一个,看Docbook DTDž®±å¯ä»¥çŸ¥é“ã€?/p>
䏋颿ˆ‘以article¾cÕdž‹çš„æ–‡æ¡£äØ“(f¨´)例ååQŒè¯´æ˜ŽDocbook文档的制作过½E‹ã€?/p>
首先是XML声明åQŒè¯´æ˜Žæ–‡æ¡£çš„一些基本信æ¯ï¼š(x¨¬)
<?xml version="1.0" encoding="UTF-8"?>
ç´§æŽ¥ç€æ˜¯æ–‡æ¡£çš„DTD声明åQŒè¯´æ˜Žæ–‡æ¡£ä‹É用的DTD˜q˜æœ‰æ ¹å…ƒç´ 。典型的docbook文档的DTD声明如下åQ?/p>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
˜q™ä¸ªå£°æ˜Žè¡¨æ˜ŽåQŒæ–‡æ¡£çš„æ ¹å…ƒç´ 是<article>åQŒä‹É用外部DTDåQŒè¯¥DTDç”¨ä¸€ä¸ªå…¬å…±æ ‡è¯†ç¬¦"-//OASIS//DTD DocBook XML V4.2//EN"æ ‡è¯†åQŒè¯¥DTDä½äºŽ¾|‘络的æŸå¤„ã€‚æ ‡è¯†ç¬¦å¿…é¡»æ˜¯å…¨çƒå”¯ä¸€çš„,其åÅžå¼äØ“(f¨´)åQ?/p>
prefix//owner-identifier//text-class text-description//language//display-version
½W¬ä¸€ä¸ªprefix为â€?/-â€ï¼Œâ€?â€è¡¨½Cºæ˜¯å·²æ³¨å†Œçš„æ ‡è¯†åQŒâ€?â€åˆ™ç›¸å。其他å„部分的å«ä¹‰è‡ªå·±å¯¹ç…§ã€?/p>
接瀞®±å¯ä»¥æ·»åŠ å†…å®¹äº†(ji¨£n)ã€‚é¦–å…ˆæ˜¯æ ¹å…ƒç´ ï¼š(x¨¬)
<article>
</article>
articleå¿…é¡»æœ‰ä¸€ä¸ªæ ‡é¢˜ï¼š(x¨¬)
<article>
 (t¨©ng) (t¨©ng) (t¨©ng) <title>My Article</title>
</article>
æ ‡é¢˜?sh¨´)¹‹åŽå¿…须有内容,ä¸å¯èƒ½æœ‰æ— å†…å®¹çš„æ–‡ç« åQ?/p>
<article>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <title>My Article</title>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <sect1>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </sect1>
</article>
˜q™é‡Œæˆ‘们æ·ÕdŠ ä¸€ä¸ªå°èŠ‚ï¼Œâ€œsect1â€æ˜¯ž®èŠ‚çš„æœ€™å¶å±‚å…ƒç´ åQŒå…¶¾~–排方å¼ä¸ŽMS Word的“heading 1â€ç±»ä¼¹{€?/p>
与article相åŒåQŒsect1也必™åÀLœ‰æ ‡é¢˜åQ?/p>
<article>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <title>My Article</title>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <sect1>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <title>My Section</title>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </sect1>
</article>
sect1也ä¸å…è®¸æ— å†…å®¹ï¼š(x¨¬)
<article>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <title>My Article</title>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <sect1>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <title>My Section</title>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <para>This is my first article.</para>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </sect1>
</article>
æ£æ–‡çš„内容一般用<para>å…ƒç´ ž®è£…åQŒparaåÏx(ch¨®ng)®µè½ï¼ˆparagraphåQ‰çš„æ„æ€ã€?/p>
现在ž®±æœ‰äº?ji¨£n)一个最½Ž€å•çš„Docbook文档。list 2是完整的代ç ã€?/p>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) list 2. 一个简å•çš„article文档
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<article>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <title>My Article</title>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <sect1>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <title>My Section</title>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <para>This is my first article.</para>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </sect1>
</article>
¾~–辑完æˆä¹‹åŽåQŒä¿å˜ä(sh¨´)Ø“(f¨´)myarticle.xmlåQŒæŽ¥ç€ž®±å¯ä»¥ç”ŸæˆHTML或者PDFäº?ji¨£n)ã€?/p>
2.2 生æˆHTML
关于如何安装é…置工具åQŒå‚è§â€œå®‰è£…é…¾|®Docbookâ€ã€?/p>
我ä‹É用cygwin下的xsltprocæ¥ç”ŸæˆHTMLåQŒåœ¨cygwinçš„shellä¸è¾“入命令:(x¨¬)
xsltproc --nonet --output myarticle.html c:/docbook-xsl-1.67.2/html/docbook.xsl myarticle.xml
--nonet表示我ä¸å¸Œæœ›ä»Žç½‘¾lœèŽ·å–DTDåQŒè¿™æ ·å¯ä»¥èŠ‚çœæ—¶é—´ã€?/p>
--output指定我希望输出的文äšgå,˜q™é‡ŒæŒ‡å®šçš„æ˜¯myarticle.htmlã€?/p>
ç´§æŽ¥ç€æ˜¯ç”¨æ¥è{æ¢XMLæ–‡äšgçš„XSLæ ·å¼å•ï¼Œéœ€è¦æ³¨æ„,使用的是html目录下的XSLæ ·å¼å•ã€?/p>
æœ€åŽæ˜¯è¦å¤„ç†çš„Docbook文档ã€?/p>
没有æ„外的è¯åQŒçŽ°åœ¨ä½ ž®±å¯ä»¥ç”¨‹¹è§ˆå™¨æ‰“å¼€myarticle.html看看效果äº?ji¨£n)ã€?/p>
2.3 生æˆPDFæ–‡äšg
下é¢ä½¿ç”¨FOP生æˆPDFæ–‡äšg。关于如何安装酾|®FOPåQŒå‚è§?a >http://blog.csdn.net/mickeyrat/archive/2005/02/06/283471.aspxã€?/p>
在控制å°è¾“入命ä×o(h¨´)åQ?/p>
fop -xml myarticle.xml -xsl C:\docbook-xsl-1.67.2\fo\docbook.xsl myarticle.pdf
Linux的命令类ä¼û|¼Œæ³¨æ„docbook.xslçš„èµ\径ã€?/p>
-xml指定需è¦è{æ¢çš„docbook文档ã€?/p>
-xslæŒ‡å®šä½¿ç”¨çš„æ ·å¼å•åQŒæ³¨æ„,˜q™é‡Œä½¿ç”¨çš„foç›®å½•ä¸‹çš„æ ·å¼å•,˜q™æ˜¯ä¸“䨓(f¨´)转æ¢XSL-FOå¼€å‘çš„ã€?/p>
æœ€åŽæ˜¯è¾“出文档的文件åã€?/p>
在FOP处熘q‡ç¨‹ä¸ï¼Œä¼?x¨¬)è¾“å‡ø(gu¨®)™®¸å¤šè¯¸å?/p>
property - "background-position-horizontal" is not implemented yet.
的信æ¯ã€‚ä¸ç”¨ç†ä¼?x¨¬),˜q™æ˜¯å› 䨓(f¨´)FOP˜q˜åœ¨å¼€å‘ä¸åQŒè®¸å¤šXSL-FOçš„ç‰¹æ€§éƒ½ä¸æ”¯æŒã€‚è¿™æ ïL(f¨¥ng)š„问题òq¶ä¸å½±å“最¾lˆæ–‡æ¡£çš„生æˆã€?/p>
快打开myarticle.pdf看看效果å§ï¼Œæ˜¯ä¸æ˜¯å¾ˆä¸“业的PDF文档åQ?/p>
æ˜¯ä¸æ˜¯è§‰å¾—制作docbook文档很简å•å‘¢åQŸè¿™ä¹ˆæƒ³å¯å°±é”™äº†(ji¨£n)åQŒæœ¬æ–‡å‰©ä½™çš„部分介ç»åˆ¶ä½œDocbook文档的高¾U§æŠ€å·§ã€?/p>
3. 定制自己的XSLæ ·å¼å?/p>
å½“ä½ å¼€å§‹æ£å¼åˆ¶ä½œè‡ªå·Þqš„docbook文档之åŽåQŒä½ ä¼?x¨¬)å‘现生æˆçš„æ–‡æ¡£òq¶ä¸èƒ½å®Œå…¨æ»¡‘³ä½ å¯ÒŽ(gu¨©) ¼å¼çš„è¦æ±‚åQŒè¬å¦‚ç« èŠ‚å·ã€é¡µç ã€å—体牽{‰ã€‚è¿™ä¸€èŠ‚å°±å‘Šè¯‰ä½ å¦‚ä½•å®šåˆ¶è‡ªå·Þqš„XSLæ ·å¼å•ï¼Œç”Ÿæˆæ»¡èƒö特定需求的文档。下é¢çš„内容ä¼?x¨¬)涉åŠ(qi¨¢ng)XSLå’ŒXSL-FOã€?/p>
有ähå¯èƒ½ä¼?x¨¬)想通过修改Docbook DTD辑ֈ°å®šåˆ¶ç›®çš„åQŒä½†æ˜¯è¿™¿Uæ–¹å¼æ˜¯ä¸å¾è®®é‡‡ç”¨çš„åQŒå› ä¸ÞZ¿®æ”¹Docbook DTD之åŽåQŒä½ 的文档就ä¸å†æ˜¯Docbook文档ã€?/p>
å› äØ“(f¨´)DocbookæŠŠå†…å®¹ä¸Žæ ·å¼å®Œå…¨åˆ†å¼€åQŒæ‰€ä»¥ä¿®æ”¹XSLæ ·å¼å•,ž®Þpƒ½å¤Ÿæ”¹å˜è¾“出结果ã€?/p>
ä¸ÞZº†(ji¨£n)ä¿®æ”¹æ ·å¼å•ï¼Œä½ éœ€è¦æœ‰è‡ªå·±çš„定制层åQŒä¹Ÿž®±æ˜¯åŸÞZºŽDocbook XSLæ ·å¼å•之上开å‘自å·Þqš„æ ·å¼å•。åƒä¸‡ä¸è¦ç›´æŽ¥ä¿®æ”¹Docbook XSLæ ·å¼å•,˜q™æ ·åšæœ‰ä¸¤ä¸ª¾~ºç‚¹åQ?/p>
1) 䏿˜“¾l´æŠ¤åQšä½ 的修改å¯èƒ½ä¼š(x¨¬)åˆ†æ•£åœ¨å‡ å个文äšgä¸ï¼Œ˜q‡å‡ å¤©ï¼Œä½ å°±ä¼?x¨¬)忘记自å·×ƒ¿®æ”¹è¿‡çš„地æ–V€?/p>
2) 䏿˜“å‡çñ”åQšå¦‚æžœä½ æƒ›_‡¾U§æ ·å¼åˆ°æ–°çš„版本åQŒä½ ä¸å¾—ä¸æŠŠä½ æ‰€åšçš„æ‰€æœ‰ä¿®æ”¹åˆòq¶åˆ°æ–°çš„版本ä¸ï¼Œåˆåƈ的过½E‹ä¸è‚¯å®šè¦å¤„ç†å¤§é‡çš„冲çªåQŒåƈ且容易出错ã€?/p>
æˆ‘æƒ³ä½ åº”è¯¥çŸ¥é?lt;xsl:include>ä¸?lt;xsl:import>的区别:(x¨¬)使用<xsl: include>å¼•å…¥çš„å…ƒç´ ï¼Œå¦‚æžœæœ‰é‡å¤å®šä¹‰çš„åQŒç¬¬ä¸€‹Æ¡å‡ºçŽ°çš„æœ‰æ•ˆåQ›ä‹Éç”?lt;xsl:import>å¼•å…¥çš„å…ƒç´ ï¼Œæœ€åŽä¸€ä¸ªæœ‰æ•ˆã€‚定制层å…? 实是ä¾èµ–于XSL˜q™æ ·çš„一个特性,使用<xsl:import>引入Docbook XSLæ ·å¼å•çš„èµïL(f¨¥ng)‚¹æ–‡äšgåQŒç„¶åŽæ·»åŠ è‡ªå·Þqš„修改。list 3¾l™å‡ºä¸€ä¸ªå®šåˆ¶å±‚æ–‡äšg的框架ã€?/p>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) list 3 customization.xsl
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 (t¨©ng) (t¨©ng) (t¨©ng) <xsl:import href="html/docbook.xsl"/>
 (t¨©ng) (t¨©ng) (t¨©ng) ...
 (t¨©ng) (t¨©ng) (t¨©ng) modifications
 (t¨©ng) (t¨©ng) (t¨©ng) ...
</xsl:stylesheet>
定制层是XSLæ–‡äšgåQŒå› æ¤éœ€è¦å¼•å…¥xslçš„åå—空间。在½W¬ä¸‰è¡Œï¼Œå¼•入转æ¢HTMLçš„XSLæ ·å¼å•çš„èµïL(f¨¥ng)‚¹æ–‡äšgdocbook.xslåQŒå¦‚果是XSL-FO的定制层åQŒè“vç‚ÒŽ(gu¨©)–‡ä»¶åœ¨fo目录下。然åŽå°±å¯ä»¥æ·ÕdŠ è‡ªå·±çš„ä¿®æ”¹äº†(ji¨£n)ã€?/p>
å®šåˆ¶åˆ†äØ“(f¨´)两类åQŒä¸€¾cÀL˜¯ä¿®æ”¹æ ·å¼å•傿•ŽÍ¼Œä¸€¾cÀL˜¯ä¿®æ”¹æ¨¡æ¿ã€?/p>
3.1 ä¿®æ”¹æ ·å¼å•傿•?/p>
打开html/param.xsl或者f(xi¨¦)o/param.xslåQŒå¯ä»¥æ‰¾åˆ°æ‰€æœ‰çš„æ ·å¼å•傿•°ã€‚看下题q™ä¸ªä¾‹å
<xsl:param name="section.autolabel" select="0"/>
傿•°çš„åå—æ˜¯â€œsection.autolabelâ€ï¼Œå€égØ“(f¨´)â€?â€ã€‚è¿™ä¸ªå‚æ•°çš„ä½œç”¨æ˜¯æŽ§åˆ¶ç”Ÿæˆæ–‡æ¡£çš„æ—¶å€™æ˜¯å¦å¯¹ž®èŠ‚è‡ªåŠ¨¾~–å·åQŒè¬å¦‚â€?â€ï¼Œâ€?.1â€ç‰½{‰ã€‚â€?â€è¡¨½Cºå…³é—自动编å—÷€‚ä½ å¯ä»¥çœ‹ä¸€ä¸‹å‰é¢ç”Ÿæˆçš„æ–‡æ¡£åQŒæ˜¯ä¸æ˜¯æ²¡æœ‰ç« 节åøP¼Ÿ
è¦æ‰“开自动¾~–å·åQŒåªéœ€è¦è¿™æ ·ä¿®æ”¹ï¼š(x¨¬)
<xsl:param name="section.autolabel" select="1"/>
ä½ ä¸æ˜¯ç›´æŽ¥åœ¨param.xslé‡Œé¢æ”¹çš„å§ï¼Ÿå¦‚果是的è¯ï¼Œèµ¶ç´§æ”¹å›žæ¥ï¼åƒä¸‡è®°å¾—åQŒæ‰€æœ‰çš„修改都写在å‰é¢ç”Ÿæˆçš„customization.xslã€‚çŽ°åœ¨é‡æ–°ç”ŸæˆHTMLåQ?/p>
xsltproc --nonet --output myarticle.html c:/docbook-xsl-1.67.2/customization.xsl myarticle.xml
或生æˆPDF
fop -xml myarticle.xml -xsl C:\docbook-xsl-1.67.2\customization.xsl myarticle.pdf
注æ„åQŒè¿™ä¸ªå‚数对HTMLå’ŒXSL-FOéƒ½æœ‰æ•ˆï¼Œä½†æ˜¯ä½ å¿…™åÕdœ¨customization.xslä¸ç”¨<xsl:import>引入对应的è“vç‚ÒŽ(gu¨©)–‡ä»Óž¼Œå¦åˆ™ä¼?x¨¬)æŠ¥é”™ã€‚çŽ°åœ¨æ–°çš„æ–‡æ¡£æ˜¯ä¸æ˜¯å‡ºçŽ°ç« èŠ‚å·äº†(ji¨£n)åQ?/p>
冿¥ä¸€ä¸ªã€‚çœ‹ä½ çš„PDF文档åQŒè‚¯å®šæ²¡æœ‰bookmarkåQŒå› 为在fo/param.xslä¸ï¼Œbookmark的功能被关é—äº?ji¨£n)。在customization.xslé‡Œæ·»åŠ ï¼š(x¨¬)
<xsl:param name="fop.extensions" select="1"/>
˜q™æ ·FOP在处ç†çš„æ—¶å€™å°±ä¼?x¨¬)生æˆbookmark。注æ„è¿™ä¸ªå‚æ•°çš„åå—åQŒâ€œfop.extensionsâ€ï¼Œè¡¨ç¤º˜q™ä¸ªå‚数属于FOP的扩展,åªå¯¹FOPæœ‰æ•ˆã€‚å¦‚æžœä½ ä½¿ç”¨PassiveTeXåQŒé‚£ä¹ˆéœ€è¦è®¾¾|®â€œpassivetex.extensionsâ€ã€?/p>
冿¥ä¸€ä¸ªå¤æ‚点的:(x¨¬)
<xsl:param name="formal.title.placement">
 (t¨©ng) figure after
 (t¨©ng) example before
 (t¨©ng) equation before
 (t¨©ng) table before
 (t¨©ng) procedure before
 (t¨©ng) task before
 (t¨©ng)</xsl:param>
˜q™ä¸ªå‚æ•°ä½œç”¨äºŽæ–‡ç« ä¸çš„图ã€è¡¨½{‰ç‰å…ƒç´ çš„æ ‡é¢˜ï¼ŒæŽ§åˆ¶æ ‡é¢˜çš„ä½¾|®åœ¨å‰é¢åQˆbeforeåQ‰è¿˜æ˜¯åŽé¢ï¼ˆafteråQ‰ï¼Œparam.xsl预定义的都是 “beforeâ€ï¼Œ˜q™é‡ŒæŠŠfigureçš„æ ‡é¢˜æ”¾åœ¨å›¾çš„åŽé¢ã€‚è¿™ä¸ªå‚æ•°å¯¹HTMLå’ŒXSL-FOéƒ½æœ‰æ•ˆã€‚åœ¨ä½ çš„æ–‡æ¡£ä¸æ·»åŠ?lt;figure>å…? ç´ ï¼Œé‡æ–°ç”Ÿæˆæ–‡æ¡£åQŒå°±å¯ä»¥çœ‹åˆ°æ•ˆæžœã€?/p>
3.2 修改模æ¿
Docbook XSLæä¾›å¾ˆå¤šçš„傿•°æŽ§åˆ¶è¾“å‡ºçš„æ•ˆæžœã€‚ä½†æ˜¯æœ‰æ—¶å€™ï¼Œä»…ä»…ä¿®æ”¹å‚æ•°òq¶ä¸èƒ½æ»¡‘Ïx(ch¨®ng)‰€æœ‰çš„è¦æ±‚åQŒè¿™æ—Óž¼Œä½ 就需è¦ä¿®æ”ÒŽ(gu¨©)¨¡æÑ€?/p>
我们æ¥çœ‹ä¸€ä¸ªå¾ˆçŽ°å®žçš„ä¾‹å。XSL-FO定义äº?ji¨£n)一¾cÖM»¥â€œkeep-â€å¼€å¤´çš„属性,è¬å¦‚“keep-with-nextâ€ï¼Œè¡¨ç¤ºå‰é¢çš„内容与åŽé¢çš„内容必™åÕdœ¨åŒä¸€™åµï¼Œä¸èƒ½æ–开在两™åµä¸Šã€‚但是除äº?ji¨£n)tableåQ?br />FOPç›®å‰ä¸æ”¯æŒè¿™æ ïL(f¨¥ng)š„属性。所以当文档比较长的时候,在FOP生æˆçš„PDF文档ä¸ï¼Œä½ 会(x¨¬)å‘现有æŸäº›å°èŠ‚çš„æ ‡é¢˜åœ¨ä¸€™å늚„底部åQŒè€Œå†…容å´åœ¨ä¸‹ä¸€™åµï¼Œå…¶ä»–æœ‰æ ‡é¢˜çš„å†…å®¹åQŒè¬å¦‚图åQŒéƒ½ä¼?x¨¬)出现这æ ïL(f¨¥ng)š„æƒ…况。这当然是ä¸åˆç†çš„ï¼Œå¯æ˜¯æ— è®ºä½ æ€Žä¹ˆæ·ÕdŠ â€œkeep-â€ç±»çš„傿•ŽÍ¼Œéƒ½æ— ‹¹ŽäºŽäº‹ã€?/p>
对于˜q™æ ·çš„æƒ…况,FOPçš„FAQå‘Šè¯‰ä½ çš„ž®±æ˜¯åQŒâ€œå¯¹ä¸è“våQŒæˆ‘们还没有实现â€ï¼Œè‡³äºŽä»€ä¹ˆæ—¶å€™å®žçŽŽÍ¼Œâ€œä½ 别问åQŒæˆ‘也ä¸çŸ¥é“â€ã€?/p>
所以åªèƒ½é‡‡å–一个å˜é€šçš„æ–¹å¼ã€‚å‰é¢æˆ‘说过åQŒFOP对于table支挘q™æ ·çš„属性,那么是å¦å¯ä»¥è€ƒè™‘把这æ ïL(f¨¥ng)š„内容攑֜¨table里é¢å‘¢ï¼Ÿå½“ç„¶å¯ä»¥åQ?
FOP有一个“blind tableâ€çš„æ¦‚念åQŒè¿™æ ïL(f¨¥ng)š„表除äº?ji¨£n)å…¶ä¸çš„内容是ä¸å¯è§çš„,æ£ç¬¦åˆæˆ‘ä»¬çš„è¦æ±‚。现在的问题ž®±æ˜¯åQŒDocbook
XSLæ ·å¼å•生æˆçš„æ˜¯é€šç”¨çš„XSL-FOæ–‡äšgåQŒä¸ä¼?x¨¬)把å?lt;sect2>˜q™ç§å…ƒç´ 的内å®ÒŽ(gu¨©)”¾åˆ°â€œblind
tableâ€é‡Œé¢ã€‚é‚£ž®±åªå‰©ä¸€æ¡èµ\äº?ji¨£n)(其实˜q˜æœ‰ä¸€æ¡ï¼Œç”¨å•†ä¸šäñ”å“^_^åQŒRenderXçš„XEP支æŒâ€œkeep-â€ç±»å±žæ€§ï¼‰(j¨ª)åQŒä¿®æ”ÒŽ(gu¨©) ·å¼å•模æ¿ã€‚list
4çš„ä»£ç æŠŠ<sect2>的内å®ÒŽ(gu¨©)”¾åˆîC¸€ä¸ªâ€œblind tableâ€é‡Œé¢ã€?br /> (t¨©ng)
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) list 4. blindtable.xsl
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) xmlns:fo="http://www.w3.org/1999/XSL/Format"
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) version="1.0">
 (t¨©ng) (t¨©ng) (t¨©ng) <xsl:import href="docbook.xsl"/>
 (t¨©ng) (t¨©ng) (t¨©ng) <xsl:template match="sect2">
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:variable name="id">
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:call-template name="object.id"/>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </xsl:variable>
 (t¨©ng) (t¨©ng)
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <fo:table table-layout="fixed" width="100%">
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <fo:table-column column-number="1"/>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <fo:table-body>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <fo:table-row keep-with-next="always">
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <fo:table-cell id="{$id}" xsl:use-attribute-sets="section.level2.properties">
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:call-template name="sect2.titlepage"/>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </fo:table-cell>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </fo:table-row>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:variable name="toc.params">
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:call-template name="find.path.params">
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </xsl:call-template>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level >= 2">
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:call-template name="section.toc"/>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:call-template name="section.toc.separator"/>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </xsl:if>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </xsl:variable> (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng)
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <fo:table-row>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <fo:table-cell>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:apply-templates select="*[2]"/>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </fo:table-cell>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </fo:table-row>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </fo:table-body>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) </fo:table>
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <xsl:apply-templates select="*[position() > 2]"/>
 (t¨©ng) (t¨©ng) (t¨©ng) </xsl:template>
</xsl:stylesheet>
对于˜q™æ®µä»£ç ž®×ƒ¸å¤šåšè§£é‡Šäº?ji¨£n),æ€Èš„æ¥è¯´å…¶ä½œç”¨å°±æ˜¯è¦†ç›–äº†(ji¨£n)sections.xslä¸å®šä¹‰çš„å䨓(f¨´)“sect2â€çš„æ¨¡æ¿åQŒåœ¨ç”ŸæˆXSL-FOæ–‡äšg的时 候,æŠ?lt;sect2>çš„æ ‡é¢˜å’Œå†…å®¹åˆ†åˆ«æ”‘Öˆ°ä¸€ä¸ªå•åˆ—è¡¨çš„ä¸¤è¡Œã€‚å› ä¸ø™¿™é‡Œç”¨åˆîCº†(ji¨£n)foåå—½Iºé—´åQŒæ‰€ä»¥åœ¨å¼€å§‹è¦å¼•å…¥foåå—½Iºé—´ã€?/p>
釿–°ç”ŸæˆPDFæ–‡äšgåQ?/p>
fop -xml yourarticle.xml -xsl C:\docbook-xsl-1.67.2\blindtable.xsl yourarticle.pdf
ä½ ä¼š(x¨¬)å‘现所æœ?lt;sect2>的内å®ÒŽ(gu¨©)²¡æœ‰æ ‡é¢˜ä(sh¨´)¸Žå†…容æ–开在两™åµä¸Šçš„æƒ…况了(ji¨£n)ã€?/p>
4. æ€È»“
到æ¤ä¸ºæ¢åQŒä½ å·²ç»äº?ji¨£n)解制作Docbook的完整过½E‹ï¼š(x¨¬)
1) ¾~–辑XML文档åQ?br />2) 生æˆHTML/PDFåQ?br />3) 定制XSLæ ·å¼å•ã€?/p>
定制XSLæ ·å¼å•ä¸èƒ½ç›´æŽ¥ä¿®æ”¹Docbook XSLæ ·å¼å•,需è¦åˆ›å»ÞZ¸€ä¸ªæ–°çš„XSLæ–‡äšgä½œäØ“(f¨´)定制层ã€?/p>
XSLæ ·å¼å•定制有两类åQ?/p>
1) 修改XSL傿•°åQ?br />2) 修改XSL模æ¿ã€?/p>
æ€ÖM¹‹Docbook是å分强大的工具åQŒå¯ä»¥ç”¨æ¥åˆ¶ä½œéžå¸æ€¸“业漂亮的技术文档,甚至是其他文档ã€?/p>
å‚è€ƒæ–‡ç« ï¼š(x¨¬)
DocBook XSL: The Complete Guide
使用Docbookå‘布文档åQŒéœ€è¦å®‰è£…以下的工具åQ?br /> (t¨©ng) (t¨©ng) (t¨©ng) *DocBook DTD
 (t¨©ng) (t¨©ng) (t¨©ng) *DocBook XSL æ ·å¼å?br /> (t¨©ng) (t¨©ng) (t¨©ng) *XSLT处熽E‹åº
 (t¨©ng) (t¨©ng) (t¨©ng) *XSL-FO处熽E‹åº
下é¢è¯¦ç»†ä»‹ç»å„个工具的安装ã€?/p>
1.安装DocBook DTD
Docbook DTDå¯ä»¥åˆ°OASIS的网站上下è²åQŒåœ¨˜q™é‡Œä½ å¯ä»¥æ‰¾åˆ°zipæ ¼å¼çš„压¾~©åŒ…。目å‰çš„æœ€æ–°ç‰ˆæœ¬æ˜¯4.2ã€?/p>
事实上å¯ä»¥ä¸ä¸‹è²Docbook DTDã€‚å¦‚æžœä½ çš„æ–‡æ¡£DTD声明˜q™æ ·å†™ï¼š(x¨¬)
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" (t¨©ng) "
如果选择使用本地DTDåQŒæ–‡æ¡£çš„DTD引用应该˜q™æ ·å†™ï¼š(x¨¬)
Linux:
<!DOCTYPE book SYSTEM "/usr/share/docbook-4.2/docbookx.dtd">
Windows:
<!DOCTYPE book SYSTEM "file:///C:/xml/docbook42/docbookx.dtd">
Docbookæä¾›äº?ji¨£n)一¿Uæ–¹å¼ï¼Œè®©ç”¨æˆ·å¯ä»¥ä‹É用相åŒçš„DTD声明åQŒä½†å¯ä»¥åœ¨ä‹É用网¾lœèŽ·å–DTDå’Œä‹É用本地DTD之间切æ¢åQŒåŒæ—¶æ‹¥æœ‰ä¸¤è€…的优势。这ž®±æ˜¯catalogæ–‡äšg的作用。典型的catalog的声明如下:(x¨¬)
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
 (t¨©ng) <group id="DocbookDTD" prefer="public">
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) <system (t¨©ng)
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) systemId="http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
 (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) uri="file:///usr/share/xml/docbook42/docbookx.dtd"/>
 (t¨©ng) </group>
</catalog>
˜q™ä¸ªå£°æ˜ŽæŠŠç½‘¾lœDTDæ˜ å°„åˆ°æœ¬åœ°DTD。如果ä‹É用支æŒCatalogçš„XSLT ProcessoråQŒå®ƒé¦–å…ˆä¼?x¨¬)查找本地文ä»Óž¼Œå¦‚果本地文äšgä¸å˜åœ¨ï¼Œå†æŸ¥æ‰„¡½‘¾lœã€?/p>
2.安装Docbook XSLæ ·å¼å?/p>
åœ?a >http://docbook.sourceforge.net上å¯ä»¥ä¸‹è½½åˆ°Docbook XSLæ ·å¼å•ï¼Œç›®å‰æœ€æ–°çš„版本æ˜?.67.2ã€?/p>
解压之åŽåQŒæœ‰å‡ 个比较主è¦çš„目录:(x¨¬)
 (t¨©ng)*common (t¨©ng) (t¨©ng) - 包å«çš„æ˜¯å…¬ç”¨çš„æ¨¡å—,诸如è¯è¨€ä¹‹ç±»çš„æ–‡ä»‰™ƒ½åœ¨è¿™é‡Œã€?br /> (t¨©ng)*extensions - 针对特定的XSLT Processor¾~–写的扩展代ç ã€?br /> (t¨©ng)*fo (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) - 生æˆXSL-FOæ–‡äšg所需的XSLæ ·å¼å•ã€?br /> (t¨©ng)*html (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) - 生æˆHTMLæ–‡äšg所需的XSLæ ·å¼å•ã€?br /> (t¨©ng)*images (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) - ç”Ÿæˆæ–‡æ¡£æ—¶æ‰€éœ€è¦çš„囄¡‰‡ã€?br /> (t¨©ng)*doc (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) - 有关XSLæ ·å¼å•的文档åQŒåŒæ äh˜¯Docbook文档ã€?/p>
å…¶ä»–˜q˜æœ‰åƒhtmlhelpä¹‹ç±»çš„ç›®å½•ï¼Œä½†ä¸æ˜¯ç”ŸæˆHTML或XSL-FO所必须的ã€?/p>
3.安装XSLT Processor
ç›®å‰æœ‰è®¸å¤šå…费的XSLT ProcessoråQŒæœ€å¸¸ç”¨çš„æ˜¯
 (t¨©ng)*Saxon (t¨©ng) (t¨©ng) (t¨©ng) - 使用Java实现åQ?a >http://saxon.sourceforge.net/ã€?br /> (t¨©ng)*Xalan (t¨©ng) (t¨©ng) (t¨©ng) (t¨©ng) - 有Javaå’ŒC++版本åQ?a >http://xml.apache.org/xalan-j/index.htmlã€?br /> (t¨©ng)*xsltproc - 使用C实现åQŒæ˜¯æœ€å¿«çš„处熽E‹åºåQ?a >http://xmlsoft.org/XSLT/
 (t¨©ng)
å› äØ“(f¨´)Saxonå’ŒXalan都有Java版本åQŒæ‰€ä»¥æŒ‰ç…§ä¸€èˆ¬çš„Java½E‹åºçš„安装方å¼å®‰è£…å³å¯ã€‚下é¢ä»‹¾lxsltprocçš„å®‰è£…ï¼Œå› äØ“(f¨´)它速度快,是我比较喜欢的处ç†ç¨‹åºã€?/p>
å¦‚æžœä½ ä‹É用windowsòq›_°åQŒé‚£ä¹ˆä½ 有两个方法å¯é€‰ï¼š(x¨¬)
 (t¨©ng)1) 直接下è²ä¸ºwindowsòq›_°é¢„ç¼–è¯‘çš„ç‰ˆæœ¬ã€‚ä½ éœ€è¦ä¸‹è½½libxml, libxslt, å’ŒiconvåQŒå®ƒä»¬éƒ½æ˜¯zipæ ¼å¼åQŒè§£åދ之åŽï¼Œåœ¨çŽ¯å¢ƒå˜é‡PATH䏿·»åŠ xsltproc.exeå’?dllæ–‡äšgçš„èµ\径ã€?br /> (t¨©ng)
 (t¨©ng)å¦‚æžœä½ ä¸æƒ³ç¼–辑环境å˜é‡ï¼Œä¸€ä¸ªç®€å•的办法是把下题q™äº›æ–‡äšgå¤åˆ¶åˆ°C:\Windows\System32åQ?br />
 (t¨©ng) libxslt.dll
 (t¨©ng) libxml2.dll
 (t¨©ng) libexslt.dll
 (t¨©ng) iconv.dll
 (t¨©ng) xsltproc.exe
 (t¨©ng)˜q™æ ·åœ¨å‘½ä»¤è¡Œž®±å¯ä»¥ç›´æŽ¥æ‰¾åˆ°è¿™äº›æ–‡ä»¶äº†(ji¨£n)。完æˆä¹‹åŽï¼Œ˜q行
 (t¨©ng)xsltproc -version
 (t¨©ng)打å°å‡ºç‰ˆæœ¬å·åˆ™è¡¨æ˜Žå®Œæˆå®‰è£…ã€?br /> (t¨©ng)
 (t¨©ng)2) 在Cygwin下安装,˜q™æ˜¯æˆ‘选择使用的方å¼ã€‚Cygwin是一个在Windows下模拟Linux Shell的应用程åºã€‚å¦‚æžœä½ å–œæ¬¢ä»¥Linux命ä×o(h¨´)çš„æ–¹å¼æ¥ä½¿ç”¨xsltprocåQ?a >下è²Cygwin安装½E‹åºã€‚Cygwin的是通过¾|‘ç»œå®‰è£…çš„ï¼Œé¦–å…ˆä½ ä»Žå®ƒæä¾›çš„包列表ä¸é€‰æ‹©libxsltåQŒç„¶åŽå®‰è£…程åºä¼š(x¨¬)æ ÒŽ(gu¨©)®ä¾èµ–关系自动选择libxml2åQŒç¡®å®šä¹‹åŽï¼Œå®‰è£…½E‹åºä¸‹è²òq¶å®‰è£…xsltproc。完æˆå®‰è£…之åŽï¼Œä½ å°±å¯ä»¥˜q行
 (t¨©ng)xsltproc -version
æ¥æ£€æŸ¥æ˜¯å¦å®‰è£…æˆåŠŸã€?br /> (t¨©ng)
3) 如果使用LinuxåQŒå¾ˆæœ‰å¯èƒ½ç³»¾lŸå·²¾l安装了(ji¨£n)xsltproc。è¿è¡?br />
xsltproc -version
‹‚€(g¨¨)查一下是å¦å·²¾l安装。如果è¿è¡Œå‘½ä»¤å¤±è´¥ï¼Œæˆ–者版本太è€ï¼Œé‚£ä¹ˆè®‰K—®ä¸‹é¢ä¸¤ä¸ªURLèŽ·å–æœ€æ–°çš„RPM包:(x¨¬)
http://rpmfind.net/linux/rpm2html/search.php?query=libxml2
http://rpmfind.net/linux/rpm2html/search.php?query=libxslt
ç„¶åŽåˆ‡æ¢åˆ°rootæƒé™åQŒå®‰è£…新的包åQ?br />
rpm -Uv libxml2-2.6.17-2.i386.rpm
rpm -Uv libxslt-1.1.12-4.i386.rpm
完æˆä¹‹åŽåQŒå°±å¯ä»¥˜q行
xsltproc -version
‹‚€(g¨¨)查安装是å¦å®Œæˆã€?/p>
安装之åŽåQŒå°±å¯ä»¥ä½¿ç”¨xsltprocæ¥ç”ŸæˆHTML或者XSL-FOæ–‡äšgã€?/p>
è¬å¦‚åQŒç”ŸæˆHTMLåQ?br />
xsltproc (t¨©ng) --output myfile.html (t¨©ng) docbook-xsl/html/docbook.xsl myfile.xml
或者生æˆXSL-FO文档åQ?br />
xsltproc --output myfile.fo docbook-xsl/fo/docbook.xsl myfile.xml
åœ?a >http://xmlsoft.org/XSLT/xsltproc2.html上列å‡ÞZº†(ji¨£n)所有xsltprocçš„å‘½ä»¤è¡Œå‚æ•°åQŒç›´æŽ¥è¿è¡?br />xsltproc也会(x¨¬)打å°å‡ºå‚数列表ã€?/p>
å¦‚æžœä½ åªè¦å‘布HTML文档åQŒé‚£ä¹ˆåˆ°æ¤äØ“(f¨´)æ¢ã€‚å¦‚æžœä½ ˜q˜æƒ³å‘布PDF或是PS文档åQŒé‚£ä¹ˆéœ€è¦å®‰è£…XSL-FO处熽E‹åºã€?/p>
4. 安装XSL-FO处熽E‹åº
XSL-FO处熽E‹åºæ ÒŽ(gu¨©)®XSLT处熽E‹åºç”Ÿæˆçš„XSL-FOæ–‡äšg生æˆPDF或者PSæ–‡äšg。目å‰å¯ä¾›é€‰æ‹©çš„XSL-FO处熽E‹åº˜qœä¸å¦‚XSLT处熽E‹åºé‚£ä¹ˆå¤šï¼Œ˜q™æ˜¯å› 䨓(f¨´)åQ?br />
 (t¨©ng) (t¨©ng) (t¨©ng) a. XSL-FOæ ‡å‡†æ¯”XSLTæ ‡å‡†çš„åˆ¶è®¢æ™šä¸¤å¹´åQ?br />
 (t¨©ng) (t¨©ng) (t¨©ng) b.XSL-FOæ ‡å‡†å?qi¨¢ng)å…¶åºžå¤§è€Œå¤æ‚ï¼Œè¯¥æ ‡å‡†çš„ä½œè€…ä¹Ÿå‘现其实çŽîC¸Šçš„éš¾åº¦ï¼Œä»Žè€Œå°†è¯¥æ ‡å‡†åˆ†ä¸ºåŸºæœ¬ã€æ‰©å±•和完整三个¾U§åˆ«ã€?/p>
现在å¯ç”¨çš„å…费的XSL-FO处熽E‹åºæœ‰ï¼š(x¨¬)
 (t¨©ng) (t¨©ng) (t¨©ng) *FOP - æ¥è‡ªApache XML™å¹ç›®ã€‚ç›®å‰æœ€æ–°çš„版本æ˜?.20.5åQŒè¿˜åœ¨å¼€å‘当ä¸ï¼Œ˜q˜æœ‰å¾ˆå¤šç‰ÒŽ(gu¨©)€§ä¸æ”¯æŒåQŒä¸˜q‡å·²¾lå¯ä»¥æ»¡‘³ä¸€èˆ¬çš„使用ã€?br /> (t¨©ng) (t¨©ng) (t¨©ng)
 (t¨©ng) (t¨©ng) (t¨©ng) *PassiveTeX - æ¥è‡ªSebastian Rahtz (http://www.tei-c.org.uk/Software/passivetex/)一‹Æ‘ÖŸºäºŽTeXçš„XSL-FO处熽E‹åºã€‚åŒæ ·ä¹Ÿåœ¨å¼€å‘ä¸åQŒè¾ƒFOPè¦å¤æ‚的多ã€?/p>
å¦å¤–有一些商业äñ”å“å¯ä¾›é€‰æ‹©åQŒå¯èƒ½ç”Ÿæˆçš„æ–‡æ¡£è´¨é‡è¦æ¯”å¼€æºä»£ç 好åQŒè¬å¦‚:(x¨¬)
 (t¨©ng) (t¨©ng) (t¨©ng) *XEP
 (t¨©ng) (t¨©ng) (t¨©ng) *XSL Formatter
下é¢ä»‹ç»å¦‚何安装FOPã€?/p>
4.1.首先需è¦å®‰è£…JDKåQŒè¿™ä¸ªä¸ç”¨å¤šè¯´ã€?/p>
4.2. 下è²FOPåQŒå¯ä»¥é€‰æ‹©tar或者zip压羃包。下载之åŽè§£åŽ‹åˆ°æœ¬åœ°ã€?/p>
4.3. 下è²å›‘ÖŞ代ç 库。FOPè‡ªå·±ä¸æ”¯æŒPNGä¹‹ç±»çš„å›¾ç‰‡ï¼Œå¦‚æžœåœ¨ä½ çš„æ–‡æ¡£é‡Œä¼?x¨¬)涉åŠ(qi¨¢ng)到囄¡‰‡åQŒé‚£ä¹ˆéœ€è¦ä¸‹è½½é¢å¤–的代ç 库。å¯ä»¥é€‰æ‹©JAIåQŒæˆ–è€?a >Jimiã€?.20.5之å‰çš„版本åªèƒ½ä‹É用Jimi。下载之åŽï¼Œž®†jai_core.jarå’Œjai_codec.jaråQˆJAI)åQŒæˆ–者JimiProClasses.jaråQˆJimiåQ‰å¤åˆ¶åˆ°FOP安装目录的lib目录下,然åŽåœ¨fop.batåQˆWindowsòq›_°åQ‰ä¸æ·ÕdŠ
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jai_core.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jai_codec.jar
或是
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\JimiProClasses.zip
如果使用fop.shåQˆLinuxòq›_°åQ‰ï¼Œä¼?x¨¬)自动æœç´¢ã€?/p>
4.4. æ·ÕdŠ æ‰©å±•ä»£ç 。如果Docbook XSLæ ·å¼å•有针对FOP的扩展代ç ï¼ˆç›®å‰æ²¡æœ‰åQ‰ï¼Œåƒä¸Šé¢ä¸€æ ähŠŠå®ƒä»¬æ·ÕdŠ åˆ°FOP安装目录下lib目录ã€?/p>
现在ž®±å¯ä»¥ä‹É用FOPæ¥ç”ŸæˆPDF文档äº?ji¨£n)。FOPæä¾›ä¸¤ä¸ªè„šæœ¬fop.batåQˆWindowsòq›_°åQ‰å’Œfop.shåQˆUnixå’ŒLinuxòq›_°åQ‰ä»¥æ–¹ä¾¿ä½¿ç”¨ã€‚生æˆPDF的命令行如下åQ?br />
 (t¨©ng) (t¨©ng) (t¨©ng) Linux或UnixåQ?br /> (t¨©ng) (t¨©ng) (t¨©ng) fop.sh -xsl /docbook-xsl/fo/docbook.xsl -xml myfile.xml -pdf myfile.pdf
 (t¨©ng) (t¨©ng) (t¨©ng)
 (t¨©ng) (t¨©ng) (t¨©ng) WindowsåQ?br /> (t¨©ng) (t¨©ng) (t¨©ng) fop.bat -xsl /docbook-xsl/fo/docbook.xsl -xml myfile.xml -pdf myfile.pdf
在处ç†è¿‡½E‹ä¸åQŒå¯èƒ½ä¼š(x¨¬)æç¤ºæŸäº›å±žæ€§ä¸æ”¯æŒæˆ–尚未实玎ͼŒä¸ç”¨ç†ä¼š(x¨¬)˜q™äº›æç¤ºåQŒå› 为FOPä»å¤„于开å‘ä¸åQŒè¿™òq¶ä¸å½±å“生æˆPDF文档ã€?/p>
到æ¤åQŒä¸€ä¸ªDocbookå‘布¾pÈ»Ÿé…置完æˆåQŒåƈå¯ä»¥ç”¨æ¥å‘布文档äº?ji¨£n)ã€‚ä½ å®Œå…¨å¯ä»¥åœ¨Linux上编写ä“Q务,通过该系¾lŸè‡ªåЍå‘布技术文档ã€?/p>
å‚è€ƒæ–‡ç« ï¼š(x¨¬)
Docbook½Ž€ä»?/a>
制作Docbook文档
DocBook XSL: The Complete Guide