7. 插图清单
1. 截图举例:Docbook的XML源码 .......................................................................................... xii
2. 截图举例:Docbook的可以生成多种格式 ............................................................................. xiii
3. 截图举例:Docbook的XML源码生成的HTML ...................................................................... xiv
4. 截图举例:Docbook的XML源码生成的HTMLs ..................................................................... xiv
5. 截图举例:Docbook的XML源码生成的PDF .......................................................................... xv
6. 截图举例:Docbook的XML源码生成的CHM ........................................................................ xv
7. 截图举例:Docbook的XML源码生成的TXT .......................................................................... xvi
8. 截图举例:Docbook的XML源码生成的RTF ......................................................................... xvii
9. 截图举例:Docbook的XML源码生成的WEBHELP ............................................................... xvii
3.1. coref在HTML中的效果 ..................................................................................................... 58
vii
38. Docbook开发过程
中的注意事项和心得
2.3. qanda系列的用法
QA相关的关键字包括:qandaset,qandadiv,qandaentry,question,answer
其相关的用法举例,自己去参考官网的解释:qandaset
6
此处需要特别提示的是,对于qandadiv和qandaentry等,是不能随便放在某个section,sect1,para等
之下使用的
我就是没注意,结果折腾了半天,始终出现错误:
org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "{http://
www.w3.org/1999/XSL/Format}block" is not a valid child of "fo:root"! (See position 29:6604)
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://
www.w3.org/1999/XSL/Format}block" is not a valid child of "fo:root"! (See position 29:6604)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)
Caused by: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException:
"{http://www.w3.org/1999/XSL/Format}block" is not a valid child of "fo:root"! (See position
29:6604)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(
TransformerIdentityImpl.java:501)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
... 3 more
结果始终不知道错在哪里,调试到最后,终于发现了,原来是qandaset等关键字,只能在
chapter,article等之下使用,不能随便放在某个section,sect1,para等之下使用
所以,不要像我一样,想要在别处使用,导致始终出错,浪费了很长时间。。。
2.4. FOP相关注意事项
2.4.1. FOP的字体设置
关于FOP的字体的设置,对于最新版本的1.0的FOP来说,其设置很简单,参考官网的解释:Apache™
7
FOP: Fonts - Custom Fonts ,只需要在配置文件fop.xconf中的renderers→renderer→fonts中,添
加如下内容即可。
<directory recursive="true">file:///c:/windows/fonts/</directory>
<auto-detect/>
而与此相比,之前旧版本的FOP对于字体的设置,则相对比较繁琐,因为除了要用对应的命令去生成字
体文件所对应的Metric文件之外,还要把相关配置添加到上述fop.xconf中去。
6
7
http://www.docbook.org/tdg/en/html/qandaset.html
http://xmlgraphics.apache.org/fop/1.0/fonts.html#custom
18
42. Docbook开发过程
中的注意事项和心得
此时,编译生成pdf过程中,生成fo的时候出错:
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "fo:table" is
missing child elements. Required content model: (marker*,table-column*,table-header?,tablefooter?,table-body+) (See position 27:127554)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)
其中可以看出,已经明确指出了出错的具体位置:27:127554
即,错误行号linenumber是27,行内偏移量offset为127554
调试无缩进的(xml格式的)fo文件. 但是,当你去用Notepad++打开fo文件的话,所看到的内容是
这样的:
然后去通过选择:语言 → XML,进行语法高亮后,变成:
22
46. Docbook开发过程
中的注意事项和心得
对应的出错的提示中,行号和行内位置,也都变了:
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "fo:table" is
missing child elements. Required content model: (marker*,table-column*,table-header?,tablefooter?,table-body+) (See position 7594:441)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)
变成错误行号是7594,行内偏移量是441了。然后就去跳转到对应的行:
26
50. 第 3 章 Docbook开发过程中的常见问题
及解答
3.1.
ValidationException: Property ID xxx previously used
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException:
Property ID "ref.ldr_syntax" (found on "fo:block") previously used; ID values must be
unique within a document! (See position 1315:169)
很常见的问题,即源码中,某个id的值,和之前的重复了。
常出现于,从别处拷贝了某段代码,然后修改完毕后,残留部分内容,导致其中有重复的id
解决办法:将重复的id删除或者改名
3.2.
ValidationException: xxx is not a valid child of xxx
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException:
"{http://www.w3.org/1999/XSL/Format}list-item" is not a valid child of "fo:block"! (See
position 345:1605)
错误的根本原因是:非正确地使用了某个标签。
比如某个元素不是另一个元素的子元素,但却由于不熟悉,而误用了。
但是具体的表现形式,那可能是多种多样的。
下面就简单列举一下,我所遇到过的错误的例子:
1. 在callout中使用了qandaentry
1
结果导致此错误。然后去官网查了下:qandaentry ,才得知,qandaentry的父标签,只
包含三种:answer, qandadiv, qandaset。所以,此处在callout中使用qandaentry,肯定
会出错了。
解决办法:不使用该标签,或者换一个合法的位置使用该标签。
2. 在part下,title和chapter之间,使用了para
结果导致报错:
org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "{http://
www.w3.org/1999/XSL/Format}block" is not a valid child of "fo:root"!
后来是删除了para,才去掉此错误的。
详情参考:【已解决】org.apache.fop.apps.FOPException:
org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}block"
2
is not a valid child of "fo:root"!
3.3.
ValidationException: xxx is missing child elements
org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "fo:list-itembody" is missing child elements. Required content model: marker* (%block;)+ (See
1
http://www.docbook.org/tdg/en/html/qandaentry.html
position 77:16747)
2
http://www.crifan.com/fop_error_validationexception_block_not_a_valid_child_of_fo_root/
30
72. Docbook开发过程
中的常见问题及解答
<calloutlist>
<callout id="co.note.cmdfunc" arearefs="co.cmdfunc" >
<para>要读取数据,肯定是要先发送对应的读页(read page)的命令</para>
</callout>
</calloutlist>
</programlistingco>
详情参考【已解决】Docbook中的callout图片在programlisting中不显示 -> xsltproc不支持
43
areaspec
3.38. An fo:block is wider than the available room in inline-progression-dimension
29, 2012 10:36:07 org.apache.fop.events.LoggingEventListener processEvent
An fo:block (See position 668:2859) is wider than the available room in inlineprogression-dimension. Adjusting end-indent based on overconstrained geometry rules
(XSL 1.1, ch. 5.3.4)
29, 2012 10:36:07 org.apache.fop.events.LoggingEventListener processEvent
Line 1 of a paragraph overflows the available area by 4390 millipoints. (See position
668:2859)
29, 2012 10:36:08 org.apache.fop.layoutmgr.table.TableContentLayoutManager
addAreas
tablePositions empty. Please send your FO file to [email protected]
出现类似fo:block is wider than the available room in inline-progression-dimension的问题
的话,从字面上就能看出,是block比inline宽,超过界限了
我之前遇到此问题,是在不熟悉quote的用法时,将属于block类型的table等内容,放到了属于
inline类型的quote中,导致上面的问题的。
详情请参考:【已解决】Docbook生成的pdf中,当表格在quote中时,表格头部却在底端显
44
示,而且如果内容是多行的,还会显示出多行
所以遇到此类问题的话,请自行去找找,是不是也误用了某些关键字,把属于block的东西,放
到了属于inline中去了。
解决办法:找到误用的关键字,换成适当的关键字
3.39. TransformerException: The column-number or number of cells in the row overflows the
number of fo:table-columns specified for the table
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException:
The column-number or number of cells in the row overflows the number of fo:tablecolumns specified for the table. (See position 12:37135)
从字面上就能看出,是说明某个列数或者是单元格数目,超过了表格所定义的
比如我此处不小心写成的:
<table><title>USB 3.0的引脚定义</title>
43
44
http://www.crifan.com/docbook_callout_bug_not_appear_in_programlisting/
http://www.crifan.com/docbook_when_in_quote_table_header_in_bottom_and_show_multiple_line/
52
73. Docbook开发过程
中的常见问题及解答
...
...
<tgroup cols="4">
<tbody>
<row><entry>Shell</entry><entry>Shell</entry><entry namest="col3"
nameend="col5" >Shield</entry></row>
</tbody>
</tgroup>
</table>
即在tgroup中定义了cols列数为4,结果不小心在tbody中的某行,错写了某个
entry,nameend为col5,超过了本身所定义的最多4列,因此才出现此错误。
解决办法:去对应表格中,仔细找找,肯定是有某处,不小心,写错了,导致列的书目或者是单
元格的数目,超过了table的tgroup中所定义了列数了。
3.40. 如何通过xref(在别处)引用某个段落(para)?
可以给para添加一个包裹层,比如用tip包裹起来para,然后给tip添加id属性,然后就可以在别
处引用此para了。
后来又知道了Docbook中还有个formalpara,即正式的段落,带标题的段落
如果想要实现段落引用,个人觉得使用formalpara效果会更好,这样,段落还可以带标题。
比如我后来就遇到一个情况,希望引用别处的某段代码,其是在某个para里面的,之前的做法是
专门用tip给这段programlisting包裹起来,然后给tip添加id属性,然后在别处引用此源码,现
在就可以把tip换成formalpara,然后给formalpara添加id属性,这样就方便别处引用此
formalpara了
45
解决办法:使用formalpara ,然后给formalpara添加id属性,即可在别处通过xref引用
3.41. WARNING: Content overflows the viewport of the fo:region-body on page 9 in blockprogression direction by 99828 millipoints. (See position 2:5700)
警告说是,有些的内容显示,溢出实际所定义的范围了
出现溢出的东西,有多种,有的是表格内的文字溢出单元格,有的是图片显示超过了当前页面等
等,而使得显示出来的效果,超过了其可视范围(viewpoint)
此溢出问题,有些是无关紧要的,在显示出来的效果上,也看不出有啥异常。
有些则是显示出来的效果,的确有重叠,覆盖等问题。所以,要根据实际情况而定。
解决办法:当显示效果没啥异常的话,可以忽略此警告。如果显示效果的确有问题了,则需要去
找到对应的代码的位置,进行微调,比如修改表格中单元格的宽度设置等,以避免内容溢出而导
致的内容显示异常问题。
3.42. PDF中callout不能点击跳转(而HTML中却可以)
原因是fo的xsl中co的配置,对于arearef没有正确添加对应的fo:basic-link的internaldestination,导致了生成的pdf中,callout图片不带链接,无法点击。而对应的HTML的xsl配
置中,有对于arearef的处理,会生成对应的href,所以HTML中是callout是可以点击的。
解决方法:给fo的xsl中添加如下配置即可:
45
http://www.docbook.org/tdg/en/html/formalpara.html
53
74. Docbook开发过程
中的常见问题及解答
<!--================================
============================================
callout setting
================================
=============================================-->
<!-- from docbook-xsl-ns-1.76.1focallout.xsl -->
<xsl:template match="d:co">
<!-- added by crifan start -->
<fo:inline>
<fo:basic-link>
<xsl:if test="@linkends">
<xsl:attribute name="internal-destination">
<xsl:value-of select="@linkends"/>
</xsl:attribute>
</xsl:if>
<!-- added by crifan end -->
<xsl:call-template name="anchor"/>
<xsl:apply-templates select="." mode="callout-bug"/>
<!-- added by crifan start -->
</fo:basic-link>
<!-- added by crifan end -->
</fo:inline>
</xsl:template>
<xsl:template match="d:coref">
<!-- tricky; this relies on the fact that we can process the "co" that's -->
<!-- "over there" as if it were "right here" -->
<xsl:variable name="co" select="key('id', @linkend)"/>
<xsl:choose>
<xsl:when test="not($co)">
<xsl:message>
<xsl:text>Error: coref link is broken: </xsl:text>
<xsl:value-of select="@linkend"/>
</xsl:message>
</xsl:when>
<xsl:when test="local-name($co) != 'co'">
<xsl:message>
<xsl:text>Error: coref doesn't point to a co: </xsl:text>
<xsl:value-of select="@linkend"/>
</xsl:message>
</xsl:when>
<xsl:otherwise>
<fo:inline>
<!-- added by crifan start -->
<fo:basic-link>
<xsl:if test="@linkend">
<xsl:attribute name="internal-destination">
<xsl:value-of select="@linkend"/>
</xsl:attribute>
</xsl:if>
<!-- added by crifan end -->
<xsl:call-template name="anchor"/>
<xsl:apply-templates select="$co" mode="callout-bug"/>
<!-- added by crifan start -->
</fo:basic-link>
54