DocBook

hide
DocBook
hide
前言:我的 DocBook 之旅
hide
我为什么选择了 DocBook
hide
2001下半年,负责撰写防火墙API参考
leaf
一个需要持久维护的文档,Word文档很难
leaf
一个可以在 Web 上生成表现一致且美观的文档
hide
榜样的力量
hide
DocBook 推广受阻
hide
学习曲线陡峭,公司内部难以推广
leaf
技术人员的“专利”
hide
人员流动频繁,培训跟不上
leaf
不付费的培训难以维持 ;-)
hide
协同著作能力较差
hide
需要依靠版本控制系统建立协同著作功能
leaf
可能还需要建立邮件列表提供邮件通知功能
hide
需要建立可行的内部网站管理规范,以便通过网站对文档的展示
leaf
文档的自动编译
leaf
新文档的加入
leaf
文档的分类
leaf
Wiki 在协同著作上面具有先天的优势
hide
DocBook 生命力依旧
hide
出版领域上的优势
leaf
包括个人发表作品
leaf
DocBook 满足多种格式需要。主要是可打印版本的需求
leaf
和 Wiki 比起来,DocBook 撰写的文档可以下载,本地浏览
leaf
DocBook 的文档可署名、和分发,更有成就感
hide
我的文档写作模式
leaf
Wiki 是协同著作的首选,也可以作为日志系统
leaf
FreeMind 整理思路,针对大文档
leaf
DocBook,产品文档,个人著作出版
hide
什么是 DocBook
hide
What is Docbook
leaf
一种标识语言
leaf
技术文档撰写
leaf
独立机构维护
hide
技术上说,DocBook是一个XML DTD或者 SGML DTD
leaf
以 SGML DTD 描述,历史最久,XML DTD 则后来居上
hide
DocBook 文档描述语意,而非表现
leaf
表现交给样式表处理,因此文档具有相似的外观
leaf
文档撰写更加关注内容本身,而非表现
hide
与传统字处理软件的不同
leaf
倒是有点像字处理软件之前
leaf
作者提供手稿,编辑识别文档结构,录入,修饰格式,出版
hide
优点
leaf
Single Sourcing (单一源文件维护)
leaf
可版本控制
leaf
通用、开放的XML格式
hide
缺点
leaf
协同协作方面,不如 Wiki
leaf
格式排版,不如 latex
hide
样式表
leaf
要理解为工具而非类似 CSS 一样的语言
hide
SGML/XML 标记语言基础
hide
Why SGML?
leaf
SGML 用于 DocBook 有更长久的历史
leaf
SGML 的工具也比较完善,比如一直在用 DSSSL 进行 DocBook 到 rtf 的转换
leaf
XML 则比较新,但后来居上
hide
SGML/XML 共性
leaf
共性?您是说 SGML/XML 语言的交集么?这么说可就有点问题,因为 XML 是 SGML 子集
hide
structured, semantic markup
leaf
数据结构,与表现分开
leaf
而 HTML 则离开的太远
leaf
elements
leaf
attributes
hide
实体 (entities)
leaf
简单的说:类似于宏定义,用一个名称标识一块数据,引用该名称就引入该数据
hide
复杂因为有多种分类方法
hide
可以用在两种不同文件中
leaf
DTD 和 文档中
leaf
一般实体和参数实体
leaf
一般实体和参数实体
leaf
一般实体又分为内部一般实体和外部一般实体
hide
两种不同类型的实体
leaf
已析和未析
leaf
两种或三种不同的引用方法
hide
一般实体和外部实体
hide
一般实体
leaf
一般实体声明位于文档的序言中
leaf
一般实体的声明可以引用一般实体,除非出现循环调用
leaf
常用的一般实体的定义可以放在 DTD 中,实现声明一次,多处使用
hide
外部实体
hide
可以在一个文档中引用另外的文档
leaf
如: 将一篇文章分为几个部分,用外部实体方式定义、包含
leaf
如: 引用图片文件
hide
可析实体
leaf
外部数据是需要直接包含进来的文本数据,称为 parsed entities
hide
例如
leaf
声明:

<!ENTITY ch01 SYSTEM "ch01.sgm">

<!ENTITY ch02 SYSTEM "ch02.sgm">

<!ENTITY ch03 SYSTEM "ch03.sgm">

<!ENTITY ch04 SYSTEM "ch04.sgm">



引用

<book>

&ch01;

&ch02;

&ch03;

&ch04;

</book>
hide
非析实体
leaf
外部数据是一个图片,则称为 unparsed entities
hide
例如
leaf
声明:

<!ENTITY tree SYSTEM "tree.eps" NDATA EPS>

引用:

<graphic entityref="tree"></graphic>
hide
字符实体
hide
特殊字符
hide
<, >, &
leaf
会被误认为元素或者实体
leaf
因此需要
leaf
其它字符,如非打印字符,Unicode 字符,中文等
hide
SGML
leaf
特殊字符由第三方实体分类文件定义,也称数据实体
hide
xml
hide
XML 可以用形如 &#xhhhh; 的数字字符对照表示 Unicode 字符
leaf
而 SGML 则必须进行定义
hide
参数实体
leaf
仅出现于 DTD 当中
hide
SGML 还可以出现于文档当中的标记块中
leaf
<![keyword[ and end with ]]>
hide
常见的标记块
leaf
INCLUDE
Arrow Link
leaf
IGNORE
Arrow Link
leaf
CDATA
hide
以 % 开始而非 & 符号
hide
示例
leaf
参数实体定义

<!ENTITY % draft "IGNORE">

引用参数实体,实现对文本块的控制

<![%draft;[

<para>

This paragraph only appears in the draft version.

</para>

]]>
leaf
参数实体定义

<!ENTITY % draft "INCLUDE">

引用参数实体,实现对文本块的控制

<![%draft;[

<para>

This paragraph only appears in the draft version.

</para>

]]>
leaf
注释
leaf
处理指令
leaf
好形与有效性
hide
SGML 的特征
hide
文档结构
hide
序言
leaf
SGML 文档必须有一个序言
hide
SGML Declaration (可选)
leaf
一个可选的 SGML Declaration(SGML声明)
leaf
但一般和 DTD 一起存放在外部的文件中,命名为“docbook.dcl”;
leaf
在 catalog 文件中:

SGMLDECL "dtd/4.2/docbook.dcl"
hide
Document Type Declaration (必选)
hide
例如:
leaf
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
leaf
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [

<!ENTITY nwalsh "Norman Walsh">

<!ENTITY chap1 SYSTEM "chap1.sgm">

<!ENTITY chap2 SYSTEM "chap2.sgm">

]>
hide
声明根元素是什么
leaf
book
hide
声明使用的 DTD
hide
内部子集
leaf
<!ENTITY nwalsh "Norman Walsh">

<!ENTITY chap1 SYSTEM "chap1.sgm">

<!ENTITY chap2 SYSTEM "chap2.sgm">
hide
外部子集
leaf
例如: PUBLIC "-//OASIS//DTD DocBook V3.1//EN"
hide
如何引用外部子集?

public/system 标志符

catalog 文件
leaf
可以用 Public 或者 SYSTEM 标志符
hide
SGML 多用 PUBLIC 标志符,因为有更好的移植性
leaf
XML 降低了 Public 标志符地位。

XML 必须有 System 标志符,而不必有 Public 标志符
hide
实际上 Public 标志符依赖 Catalog 文件
Arrow Link
leaf
使用外部的 Catalog 文件,建立 Public 标志符到本地的文件映射
hide
SYSTEM 标志符格式不限
leaf
在 SGML 中通常是直接指向本地的文件名, 因在移植上的问题,一般多用 Public 标志符
leaf
如: /usr/local/sgml/docbook/3.1/docbook.dtd
leaf
内部子集的声明优先于外部子集
hide
根元素
leaf
根元素紧接着序言部分(当然注释、处理指令(processing instructions)除外)
hide
与 XML 兼容性问题
hide
大小写问题
leaf
SGML中 元素、属性大小写不敏感
leaf
但是,实体名称大小写敏感
leaf
为向 XML 移植方便,请都用小写字母
hide
属性是否用引号的问题
leaf
除非属性值包含空格,否则可以不用引号将属性值括起来;
leaf
XML必须用引号将属性值扩起来
hide
如何将文章分解成几块

(利用外部实体)
leaf
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [

<!ENTITY chap1 SYSTEM "chap1.sgm">

<!ENTITY chap2 SYSTEM "chap2.sgm">

<!ENTITY chap3 SYSTEM "chap3.sgm">

<!ENTITY appa SYSTEM "appa.sgm">

<!ENTITY appb SYSTEM "appb.sgm">

]>

<book><title>My First Book</title>

&chap1;

&chap2;

&chap3;

&appa;

&appb;

</book>
hide
<chapter id="ch1"><title>My First Chapter</title>

<para>My first paragraph.</para>

...
leaf
注意不要在该文档文件头加入 DTD!
hide
XML 的特征
hide
文档结构
hide
序言
hide
XML Declaration (可选)
leaf
<?xml version="1.0" standalone="no"?>
leaf
如果没有 XML Declaration,则版本为1.0,编码为 utf-8
hide
Document Type Declaration (可选)
leaf
严格的说,XML 并不需要一个 DTD
hide
例如:
leaf
<!DOCTYPE book PUBLIC "-//Norman Walsh//DTD DocBk XML V3.1.4//EN"

"http://nwalsh.com/docbook/xml/3.1.4/db3xml.dtd">
hide
声明根元素是什么
leaf
如: book
hide
声明使用的 DTD
hide
内部子集
leaf
<!ENTITY nwalsh "Norman Walsh">

<!ENTITY chap1 SYSTEM "chap1.sgm">

<!ENTITY chap2 SYSTEM "chap2.sgm">
hide
如何引用外部子集?

public/system 标志符

catalog 文件
leaf
例如: PUBLIC "-//OASIS//DTD DocBook V3.1//EN"
hide
如何引用外部子集?
hide
SYSTEM 标志符(必选)
leaf
降低了 Public 标志符的作用
leaf
SYSTEM 标志符在 XML 中必须是 URI 格式
leaf
可以是 URL
leaf
也可以是本地文件: file:///usr/local/sgml/docbook/3.1/docbook.dtd
leaf
PUBLIC 标志符(可选)
leaf
内部子集的声明优先于外部子集
hide
根元素
hide
根元素紧接着序言部分
leaf
当然注释、处理指令(processing instructions)除外
hide
其它
hide
XML所有的标记大小写敏感
leaf
DocBook 的元素、属性、实体最好都用小写
leaf
所有属性的值无论有空格与否,都要用引号括起来
leaf
空元素要如下写法:<br/>
hide
处理指令格式: <?pitarget data?>
leaf
而 SGML 的处理指令没有最后一个问号,形如:<?pitarget data>
hide
Catalog 文件
leaf
The catalog file format was defined in 1994 by SGML Open (now OASIS). The formal specification is contained in OASIS Technical Resolution 9401:1997.
hide
优点
leaf
增加了可移植性,因为不同机器的 DTD, Entities, DSSSL/XSL 可以存放于不同位置;
leaf
避免了对带宽占用。XML 格式的 DocBook,SYSTEMID 格式为 URI,可以直接到网络上抓取,通过 catalog 建立本地映射,提高加载速度,以及减小对带宽占用
leaf
可以通过 SYSTEM sysid1 sysid2 建立本地文件映射,可以写出可移植的 Makefile
leaf
方便 DTD、样式表升级
hide
SGML 格式的 Catalog 文件
hide
语法
hide
由一系列 Ket/Value 对组成
leaf
如: PUBLIC, SYSTEM, SGMLDECL, DTDDECL, CATALOG, OVERRIDE, DELEGATE, and DOCTYPE.
hide
SGMLDECL 定义 SGML 声明
hide
SGMLDECL sysid
leaf
定义 SGML Declaration。很多工具具有默认的 SGML Declare
leaf
SGMLDECL "docbook/3.1/docbook.dcl"
hide
对不同文档设置不同 SGMLDecl
hide
DTDDECL pubid sysid
leaf
如果一个文档的 DocType 符合 pubid, 则使用 sysid 作为 SGMLDecl
hide
如: 在一个 catalog 文件中既定义 DTD 的

声明文件,又定义XML的声明文件
leaf
SGMLDECL "dtd/docbook-4.5/docbook.dcl"

DTDDECL "-//OASIS//DTD DocBook XML V4.5CR1//EN" "dsssl/docbook-dsssl-1.79/dtds/decls/xml.dcl"

DTDDECL "-//OASIS//DTD DocBook XML V4.2//EN" "dsssl/docbook-dsssl-1.79/dtds/decls/xml.dcl"

DTDDECL "-//OASIS//DTD DocBook XML V3.1//EN" "dsssl/docbook-dsssl-1.79/dtds/decls/xml.dcl"
hide
PUBLIC/SYSTEM 定位 DTD 位置
hide
PUBLIC pubid sysid
leaf
<html>PUBLIC 关键字用于 public identifiers 到 system identifiers 的映射:

<div><blockquote><i>

PUBLIC "-//OASIS//DTD DocBook V3.1//EN" "docbook/3.1/docbook.dtd"

</i></blockquote></div>



hide
SYSTEM sysid1 sysid2
leaf
<html>SYSTEM 关键字用于 system identifiers 到 system identifiers 的映射:

<div><blockquote><i>

SYSTEM "http://nwalsh.com/docbook/xml/1.3/db3xml.dtd"<br>

<blockquote><i>

"docbook/xml/1.3/db3xml.dtd"

</blockquote></i>

</i></blockquote></div>
hide
OVERRIDE bool
leaf
默认 System 标志符优先 于 Public 标志符
leaf
OVERRIDE YES,则Public 标志符优先
hide
DOCTYPE name sysid
leaf
如: DOCTYPE BOOK n:/share/sgml/docbook/3.1/docbook.dtd
leaf
定义缺省的 Doctype, 当文档没有指定 public/system 标识,或者没有定义DocType 时
leaf
CATALOG 实现 catalog 文件的级联
hide
其它
hide
DELEGATE 实现条件 catalog 级联
leaf
如: DELEGATE "-//OASIS" "/usr/sgml/oasis/catalog"
leaf
引用到 "-//OASIS" 后,采取读取相应的 catalog 文件
hide
ENTITY name sysid
leaf
实体
hide
ENTITY %name sysid
leaf
参数实体
hide
示例
leaf
-- Comments are delimited by pairs of double-hyphens,

as in SGML and XML comments. --



OVERRIDE YES



SGMLDECL "n:/share/sgml/docbook/3.1/docbook.dcl"



DOCTYPE BOOK n:/share/sgml/docbook/3.1/docbook.dtd



PUBLIC "-//OASIS//DTD DocBook V3.1//EN"

n:/share/sgml/docbook/3.1/docbook.dtd



SYSTEM "http://nwalsh.com/docbook/xml/1.3/db3xml.dtd"

n:/share/sgml/Norman_Walsh/db3xml/db3xml.dtd
hide
工具
leaf
openjade, opensp 可以利用该格式的 catalog 文件
leaf
可以在 openjade, opensp 等工具中用命令行 -c catalogfile 指定位置
leaf
也可以通过环境变量 SGML_CATALOG_FILES 指定Catalog 文件,多个catalog文件可以用冒号分隔
hide
XML格式的 Catalog 文件
hide
语法
hide
public/system 定位 DTD 位置
leaf
<?xml version="1.0"?>

<!DOCTYPE catalog

PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"

"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">

<group prefer="public" xml:base="file:///usr/share/xml/" >



<public

publicId="-//OASIS//DTD DocBook XML V4.4//EN"

uri="docbook44/docbookx.dtd"/>



<system

systemId="http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"

uri="docbook44/docbookx.dtd"/>



<system

systemId="docbook4.4.dtd"

uri="docbook44/docbookx.dtd"/>

</group>

</catalog>
hide
uri 定位 XSL 样式表位置

(本地到本地)
leaf
<?xml version="1.0"?>

<!DOCTYPE catalog

PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"

"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">



<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">

<uri

name="docbook.xsl"

uri="file:///usr/share/xml/docbook-xsl-1.68.1/html/docbook.xsl"/>

</catalog>
hide
uri 将 web 地址对应本地文件

(URL 到本地)
leaf
<?xml version="1.0"?>

<!DOCTYPE catalog

PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"

"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">



<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">



<system

systemId="http://www.oasis-open.org/docbook/xml/4.4/"

uri="file:///usr/share/xml/docbook44/" />

<uri

name="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"

uri="file:///usr/share/xml/docbook-xsl-1.68.1/html/docbook.xsl" />

<uri

name="http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl"

uri="file:///usr/share/xml/docbook-xsl-1.68.1/html/chunk.xsl" />

</catalog>
hide
rewriteSystem 建立重写规则,

简化、合并 URI 项
leaf
<?xml version="1.0"?>

<!DOCTYPE catalog

PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"

"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">

<rewriteSystem

systemIdStartString="http://www.oasis-open.org/docbook/xml/4.4/"

rewritePrefix="file:///usr/share/xml/docbook44/" />

<rewriteURI

uriStartString="http://docbook.sourceforge.net/release/xsl/current/"

rewritePrefix="file:///usr/share/xml/docbook-xsl-1.68.1/" />

</catalog>
hide
nextCatalog 实现 catalog 文件级联
leaf
For DocBook 4.4:

<nextCatalog catalog="/usr/share/xml/docbook44/catalog.xml" />



For DocBook 4.1.2:

<nextCatalog catalog="/usr/share/xml/docbook412/docbook.cat" />
leaf
示例
hide
工具
leaf
xsltproc, Saxon, Xalan 可以利用该格式的 catalog 文件
leaf
除了 xsltproc 是使用 环境变量 XML_CATALOG_FILES 外, Java 工具有自己的方式,参见后面的介绍
Arrow Link
hide
SGML 时代的 DocBook
hide
DTD
leaf
定义 DocBook SGML 文档结构的 Schema Languages
hide
SGML 和 XML 格式的 DTD 区别:
leaf
ISO 字符实体集 (ISO character entity sets)格式不同,需要对应不同的 Entities 文件
hide
内部定义的 ISO charset entities 格式
hide
sgml
leaf
<!ENTITY euro SDATA "[euro ]"><!-- euro sign -->
hide
xml
leaf
<!ENTITY euro "&#x20AC;"><!-- euro sign, U+20AC NEW -->
hide
定义 DTD 时,ho,hh 参数实体不同
hide
sgml
leaf
<!ENTITY % ho "- O">

<!ENTITY % hh "- -">
hide
xml
leaf
<!ENTITY % ho "">

<!ENTITY % hh "">
hide
对参数实体的引用
hide
引用 %ho; 的有 401 处
leaf
<!ELEMENT title %ho; (%title.char.mix;)*>
leaf
引用 %hh; 的有 0 处
leaf
DTD 中可能没有包含所需的 Entities,参见:
Arrow Link
leaf
如今,DTD 已经不是唯一选择,还有 XML Schema, RELAX NG
hide
DSSSL
hide
DSSSL
hide
what is it
leaf
a kind of Scheme (which is a kind of Lisp)
hide
OpenJade
hide
可以将 SGML/XML 转换为
leaf
html
leaf
rtf
leaf
text
leaf
Tex - DVI - PS - PDF
hide
关于处理 XML 文件
leaf
If you handle XML with OpenJade, OpenJade will by default complain bitterly about any character outside the basic 32 to 128 ASCII range. That can be avoided by setting the following three environment variables:



SP_CHARSET_FIXED=YES

SP_ENCODING=XML

SGML_CATALOG_FILES=/usr/share/sgml/jade_dsl/xml.soc

hide
有效性验证
hide
onsgmls
leaf
onsgmls.exe -sv -c /share/catalog.sgml index.xml

onsgmls.exe -sv -c /share/catalog.sgml index.sgml
hide
OpenSP
hide
编译 OpenSP 之前
hide
补丁: gcc3.4 下编译补丁
leaf
参见 Cygwin OpenSP 源代码包中的补丁
hide
Cygwin OpenSP 补丁不再需要设置 LIBS 环境变量
leaf
export LIBS=-lintl
hide
OpenSP 补丁
hide
isSgmlChar
leaf
文件: include/Syntax.h



diff -r -u OpenSP-1.5.1/include/Syntax.h OpenSP-1.5.1-new/include/Syntax.h

--- OpenSP-1.5.1/include/Syntax.h 2005-12-18 10:38:50.890625000 +0800

+++ OpenSP-1.5.1-new/include/Syntax.h 2005-12-18 10:44:20.703125000 +0800

@@ -389,7 +389,7 @@



inline Boolean Syntax::isSgmlChar(Xchar c) const

{

- return c >= 0 && set_[sgmlChar].contains(Char(c));

+ return c >= 256 || c >= 0 && set_[sgmlChar].contains(Char(c));

}



inline const StringC &Syntax::reservedName(ReservedName i) const
hide
允许中文注释
leaf
文件: lib/parseCommon.cxx



diff -r -u OpenSP-1.5.1/lib/parseCommon.cxx OpenSP-1.5.1-new/lib/parseCommon.cxx

--- OpenSP-1.5.1/lib/parseCommon.cxx 1999-11-04 16:36:13.000000000 +0800

+++ OpenSP-1.5.1-new/lib/parseCommon.cxx 2005-12-18 10:46:41.781250000 +0800

@@ -541,14 +541,12 @@

Token token;

while ((token = getToken(mode)) != tokenCom)

switch (token) {

- case tokenUnrecognized:

- if (!reportNonSgmlCharacter())

- message(ParserMessages::sdCommentSignificant,

- StringMessageArg(currentToken()));

- break;

case tokenEe:

message(ParserMessages::commentEntityEnd, startLoc);

return 0;

+ case tokenUnrecognized:

+ if (reportNonSgmlCharacter())

+ break;

default:

if (markup)

markup->addCommentChar(currentChar());
leaf
清除 INCLUDE, LIBS 等环境变量
hide
编译 OpenSP
leaf
./configure --prefix=/usr/local/opensp
leaf
make && make install
leaf
echo /usr/local/lib/opensp/lib >> /etc/ld.so.conf
hide
catalog
leaf
SGMLDECL "/home/JiangXin/work/docbook/dtd/4.5/docbook.dcl"

CATALOG "/home/JiangXin/work/docbook/dtd/4.5/docbook.cat"



DOCTYPE book /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd

DOCTYPE article /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd

DOCTYPE chapter /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
hide
应用
hide
准备
hide
创建一个 catalog 文件
hide
catalog 文件
leaf
OVERRIDE YES
leaf
SGMLDECL "/home/JiangXin/work/docbook/dtd/4.5/docbook.dcl"
leaf
CATALOG "/home/JiangXin/work/docbook/dtd/4.5/docbook.cat"
leaf
DOCTYPE book /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd

DOCTYPE article /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd

DOCTYPE chapter /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
hide
示例
leaf
-- ...................................................................... --

-- "export SGML_CATALOG_FILES=/PATH/catalog" --

OVERRIDE YES



SGMLDECL "/home/JiangXin/work/docbook/dtd/4.5/docbook.dcl"



CATALOG "/home/JiangXin/work/docbook/dtd/4.5/docbook.cat"

CATALOG "/home/JiangXin/work/docbook/style/dsssl-1.79/catalog"



-- CATALOG "dtd/openjade/catalog" --

-- CATALOG "/home/JiangXin/work/docbook/dtd/entities/catalog.sgml" --



DOCTYPE book /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd

DOCTYPE article /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd

DOCTYPE chapter /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
hide
docbook.dcl 补丁
hide
- LCNMCHAR ".-_"

- UCNMCHAR ".-_"

+ LCNMCHAR ".-_:"

+ UCNMCHAR ".-_:"
hide
否则:



onsgmls:/home/JiangXin/work/docbook/dtd/4.5/htmltblx.mod:102:9:E: character ":"

invalid: only "CDATA", "ENTITIES", "ENTITY", "ID", "IDREF", "IDREFS", "NAME", "N

AMES", "NMTOKEN", "NMTOKENS", "NOTATION", "NUMBER", "NUMBERS", "NUTOKEN", "NUTOK

ENS" and parameter separators allowed

onsgmls:/home/JiangXin/work/docbook/dtd/4.5/htmltblx.mod:110:9:E: character ":"

invalid: only "CDATA", "ENTITIES", "ENTITY", "ID", "IDREF", "IDREFS", "NAME", "N

AMES", "NMTOKEN", "NMTOKENS", "NOTATION", "NUMBER", "NUMBERS", "NUTOKEN", "NUTOK

ENS" and parameter separators allowed
hide
主要是如下参数实体中出现了 :
leaf
<!ENTITY % xml-space.attrib

"xml:space (preserve) #IMPLIED">



<!ENTITY % xml-base.attrib

"xml:case CDATA #IMPLIED">



<!ENTITY % i18n

"xml:lang NMTOKEN #IMPLIED">
hide
示例文档
hide
gb2312.sgml
leaf
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.2//EN">

<article>

<articleinfo>

<title>Hello World!</title>

<author><firstname>名</><surname>姓</></author>

</articleinfo>

<!-- 这里是注释 -->



<sect1><title>Hello World!</title>

<para>

Hello world! 这是我的第一个 DocBook 文档。

</para>

</sect1>

</article>
leaf
utf8.sgml
hide
编码问题
leaf
多个环境变量用于处理多字节以及宽字符编码的 SGML/XML,如下:
hide
SP_CHARSET_FIXED
leaf
只有当 SP_CHARSET_FIXED 设置为 1 或者 YES 时,OpenSP进入 固定字符集模式
hide
SP_ENCODING
hide
当处于固定字符集模式时,的缺省字符集
leaf
可以是: utf-8, utf-16, gb2312, big5, cn-gb, euc-cn, cn-big5, is8859-n, ...

xml 含义为 作为输入时,由XML 定义确定其编码,作为输出时,为 UTF-
hide
SP_BCTF
hide
当不处于固定字符集模式时,的缺省字符集
leaf
可用的有: utf-8, euc, big5, identity, fixed-2, fixed-4, sjis
hide
onsgmls
hide
功能
leaf
验证有效性
hide
SP 环境变量
leaf
export SP_CHARSET_FIXED=1

export SP_ENCODING=utf-8

onsgmls.exe -s -c catalog.sgml utf8.sgml
hide
命令行参数
hide
-s 关闭输出
leaf
export SGML_CATALOG_FILES=/share/catalog.sgml

onsgmls.exe -s index.sgml
hide
-c catalog 文件
leaf
SP_ENCODING=gb2312 SP_CHARSET_FIXED=1 onsgmls.exe -s -c catalog.sgml gb2312.sgml
hide
-i NAME
leaf
如同在文档的 DTD 最开始,声明了 <!ENTITY % name "INCLUDE">
hide
ospam
leaf
整理 SGML 标记(markup)
hide
命令行
leaf
ospam.exe -p -m shorttag -c catalog.sgml index.sgml
hide
osgmlnorm
hide
格式化 sgml 文档
leaf
--comments 输出注释
leaf
-d 输出 prolog
hide
示例
leaf
SP_ENCODING=utf-8 SP_CHARSET_FIXED=yes osgmlnorm -c catalog.sgml utf8.sgml 2>/dev/null | iconv -f utf-8 -t gb2312
leaf
SP_ENCODING= SP_CHARSET_FIXED= osgmlnorm --comments -c catalog.sgml gb2312.sgml
hide
Bug
leaf
--comments 对于 UTF-8 编码的文件,当 SP_ENCODING=utf-8 时无效
leaf
需要安装“中文注释”补丁
hide
osx
leaf
SGML->XML转换工具
hide
示例
leaf
SP_ENCODING=gb2312 SP_CHARSET_FIXED=YES osx -x preserve-case -x comment \

-c catalog.sgml gb2312.sgml | iconv -f utf-8 -t gb2312
leaf
SP_ENCODING=utf-8 SP_CHARSET_FIXED=YES osx -x preserve-case -x comment \

-c catalog.sgml utf8.sgml | iconv -f utf-8 -t gb2312
leaf
ospent
leaf
ospcat
hide
XML 文件的验证
leaf
SP_ENCODING=gb2312 SP_CHARSET_FIXED=yes onsgmls.exe -s -c catalog.sgml gb2312.xml
hide
OpenJade
hide
编译 OpenJade 之前
leaf
参见 Cygwin OpenJade 源代码包中的补丁
leaf
OpenSP 的补丁参见:
Arrow Link
leaf
清除 INCLUDE, LIBS 等环境变量
hide
编译 OpenJade
leaf
./configure --prefix=/usr/local/openjade \

--enable-spincludedir=/usr/local/opensp/include/OpenSP \

--enable-splibdir=/usr/local/opensp/lib
leaf
make && make install
leaf
# 将 dsssl 目录(dsssl的 DTD 声明)拷贝到适当的目录下

# 并将 dsssl 目录下的 catalog 文件加入到 SGML_CATALOG_FILES

# 环境变量,或者加入到 CATALOG 文件中;

cp -R dsssl /docbook-dtd-dsssl-directory/openjade
leaf
echo /usr/local/lib/openjade/lib >> /etc/ld.so.conf
hide
测试(参见 dsssl-doc 的例子)
hide
测试 openjade:
leaf
openjade -t rtf -d jtest.dsl jtest.sgm
hide
可能出现的错误
leaf
openjade:jtest.dsl:1:72:W: cannot generate system identifier for public text "-//James Clark//DTD DSSSL Style Sheet//EN"

openjade:jtest.dsl:1:72:E: reference to entity "STYLE-SHEET" for which no system identifier could be generated

openjade:jtest.dsl:1:0: entity was defined here

openjade:E: specification document does not have the DSSSL architecture as a base architecture
leaf
原因是没有找到 Public 标志符 "-//James Clark//DTD DSSSL Style Sheet//EN" 的位置,

需要通过 catalog 文件建立 Public 标志符到 system 标志符的映射,

该 catalog 文件名,可以通过环境变量 SGML_CATALOG_FILES 指出,

或者通过 openjade 命令行的 -c 参数指明。
hide
设置环境变量 SGML_CATALOG_FILES
leaf
export SGML_CATALOG_FILES=openjade/dsssl/catalog
leaf
openjade -t rtf -d jtest.dsl jtest.sgm
hide
或者通过 -c 参数
leaf
openjade -c openjade/dsssl/catalog -t rtf -d jtest.dsl jtest.sgm
hide
测试 DocBook DTD&DSSSL
hide
设置环境变量 SGML_CATALOG_FILES
leaf
export SGML_CATALOG_FILES=dtd/catalog:dsssl/catalog:openjade/catalog
leaf
openjade -t rtf -d d:\where-you-unpacked-the-stylesheets\docbook\print\docbook.dsl test.sgm
leaf
openjade -t sgml -d d:\where-you-unpacked-the-stylesheets\docbook\html\docbook.dsl test.sgm
hide
中文文档测试
leaf
SP_ENCODING=gb2312 SP_CHARSET_FIXED=1 \

openjade -t sgml -d d:\where-you-unpacked-the-stylesheets\docbook\html\docbook.dsl \

-V nochunks gb2312.sgml
leaf
SP_ENCODING=gb2312 SP_CHARSET_FIXED=1 \

openjade -t rtf -d d:\where-you-unpacked-the-stylesheets\docbook\print\docbook.dsl \

gb2312.sgml
hide
catalog
Arrow Link
leaf
语法参见前面的介绍
Arrow Link
hide
DSSSL
leaf
CATALOG "/home/JiangXin/work/docbook/style/dsssl-1.79/catalog"
hide
DTD for DSSSL
leaf
CATALOG "~/work/docbook/bin/openjade-1.3.3-pre1/dsssl/catalog"
hide
如何指定 DSSSL 样式表
hide
通过 prolog 或者 DTD 中的 PI 声明位置。(两种格式)
leaf
格式1: <?stylesheet href="sysid" type="text/dsssl">
leaf
格式2: <?dsssl sysid>
hide
openjade -d systemid
leaf
DSSSL systemid,声明 DSSSL 位置
leaf
和输入文件同名的,扩展名为 .dsl
hide
一个DSSSL样式表文件可能包含

多个样式,如何指定?
hide
两种方式定义的多样式DSSSL文件
hide
仅通过参数进行实体控制,

只包含一个 style-specification
leaf
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [

<!ENTITY % html "IGNORE">

<![%html;[

<!ENTITY % print "IGNORE">

<!ENTITY docbook.dsl PUBLIC "-//Norman Walsh//DOCUMENT DocBook HTML Stylesheet//EN" CDATA dsssl>

]]>

<!ENTITY % print "INCLUDE">

<![%print;[

<!ENTITY docbook.dsl PUBLIC "-//Norman Walsh//DOCUMENT DocBook Print Stylesheet//EN" CDATA dsssl>

]]>

]>

<style-sheet>

<style-specification use="docbook">

<style-specification-body>



;; common customization can go here



<![%print;[



;; customize the print stylesheet here



]]>



<![%html;[



;; customize the html stylesheet here



]]>



</style-specification-body>

</style-specification>

<external-specification id="docbook" document="docbook.dsl">

</style-sheet>
hide
不同的 style-specification 具有不同的 ID,

另外还有参数实体控制
leaf
<!DOCTYPE style-sheet PUBLIC

"-//James Clark//DTD DSSSL Style Sheet//EN" [

<!ENTITY % html "IGNORE">

<![%html;[

<!ENTITY % print "IGNORE">

<!ENTITY docbook.dsl PUBLIC

"-//Norman Walsh//DOCUMENT DocBook HTML Stylesheet//EN"

CDATA dsssl>

]]>

<!ENTITY % print "INCLUDE">

<![%print;[

<!ENTITY docbook.dsl PUBLIC

"-//Norman Walsh//DOCUMENT DocBook Print Stylesheet//EN"

CDATA dsssl>

]]>

]>



<style-sheet>



<style-specification id="print" use="docbook">

<style-specification-body>



;; customize the print stylesheet

...



</style-specification-body>

</style-specification>





<!--

;; customize the html stylesheet; parts borrowed from

;; Cygnus at http://sourceware.cygnus.com/ (cygnus-both.dsl)

-->



<style-specification id="html" use="docbook">

<style-specification-body>



... ...



</style-specification-body>

</style-specification>



<external-specification id="docbook" document="docbook.dsl">



</style-sheet>

hide
-d 参数或者 PI 中设置 的 systemid,在文件名的结尾用 #id

可以指定 DSSSL 文件中特定的 style-specification.
leaf
openjade -d systemid#print
hide
-i 参数,设定特定的实体参数为 INCLUDE
leaf
openjade -i html -d systemid#html
hide
DSSSL 定制