如何解读DocBook文档中的元素内容模型?解决复杂元素与术语困惑
官方文档里的「1.1. 理解内容模型」章节过于简洁,复杂元素的内容模型很难搞懂。文档以epigraph元素为例说明:
验证器通过内容模型判断文档是否有效。要让文档有效,每个元素的内容必须匹配其对应的内容模型。
实际来说,匹配意味着可以扩展内容模型,使其和文档中的元素序列完全一致。
例如,epigraph的内容模型如下:epigraph::= (info?⁽ᵈᵇ.ᵗⁱᵗˡᵉᶠᵒʳᵇⁱᵈᵈᵉⁿ.ⁱⁿᶠᵒ⁾,attribution?, (literallayout| 段落元素)+)
epigraph是相对简单的元素,能轻松把它文档页面里的内容模型转换成「1.1. 理解内容模型」里的紧凑格式:
epigraph ::= × ⏵
- Sequence of:
info? (db.titleforbidden.info)attribution? + One or more of:
- literallayout
- Paragraph elements
我发现紧凑格式更容易读,因为文档页面里的长格式用列表,越长越难跟踪匹配分支。比如我想知道用preface时能不能省略title元素,操作起来特别麻烦——它的内容模型有154行(见下文)。我可以试着把文档页面里的模型转换成紧凑格式,但太费时间,尤其是逐个处理每个元素的时候。这个过程可以自动化,但我还有术语理解的问题,比如Interleave of是不是指允许重复元素的无序列表?(Sequence of的意思很明确:按顺序使用这些元素或元素组。)
我曾在docbook/docbook仓库里找preface的定义,但目前还搞不懂Relax NG和Schematron模式。最后在docbook/defguide仓库里找到一段代码片段,解决了最初的问题;把它和长格式内容模型对比有帮助,但肯定有更简单的推理方法。(另外,在线很难找到特定的DocBook示例。)
<preface> <info> <title>Preface to the DocBook V5.1 Edition</title> </info> <para>This edition of ...</para> </preface>
preface ::= × ⏵ ⏷
- Sequence of:
- One of:
- Sequence of:
- Interleave of:
titletitleabbrev?subtitle?
info? (db.titleforbidden.info)
- Interleave of:
info(db.titlereq.info)
- Sequence of:
- Optional sequence of:
- Zero or more of:
bibliographyglossaryindextoc
- One of:
- Sequence of:
- One or more of:
annotationbridgeheadformalgroupremarkrevhistory- 索引行内元素 ⏵ ⏷
- 警示元素 ⏵ ⏷
- 正式元素 ⏵ ⏷
- 图形元素 ⏵ ⏷
- 非正式元素 ⏵ ⏷
- 列表元素 ⏵ ⏷
- 段落元素 ⏵ ⏷
- 出版元素 ⏵ ⏷
- 大纲元素 ⏵ ⏷
- 技术元素 ⏵ ⏷
- 逐字元素 ⏵ ⏷
- Optionally one of:
- Sequence of:
- One or more of:
section
- Zero or more of:
simplesect
- One or more of:
- One or more of:
simplesect
- Sequence of:
- One or more of:
sect1
- Zero or more of:
simplesect
- One or more of:
- One or more of:
refentry
- Sequence of:
- One or more of:
- Sequence of:
- One or more of:
section
- Zero or more of:
simplesect
- One or more of:
- One or more of:
simplesect
- Sequence of:
- One or more of:
sect1
- Zero or more of:
simplesect
- One or more of:
- One or more of:
refentry
- Sequence of:
- Zero or more of:
bibliographyglossaryindextoc
- Zero or more of:
- One of:
内容的提问来源于stack exchange,提问作者toraritte

