![](/img/trans.png)
[英]How to create a new entity with RELAX NG schema in DocBook V5.0
[英]What is the relationship between RELAX NG and Schematron wrt DocBook?
我很确定这个问题需要改进,但无法用一句话更好地表达我的困惑:
DocBook 5.2:权威指南,第1.1 节。 A Short DocBook History指出
从 DocBook V5.0 开始,DocBook 完全是一个用 RELAX NG 和 Schematron 定义的 XML 词汇表。
根据Wikipedia on RELAX NG ,它是一种“ XML 模式语言——RELAX NG 模式指定了 XML 文档的结构和内容的模式”。
另一方面, Schematron “是一种基于规则的验证语言,用于断言 XML 树中是否存在模式。它是一种以 XML 表示的结构模式语言。 ”
所以两者都是模式语言,但是
RELAX NG用于定义用于创建 XML 文档的词汇表(这是一种用标签(?)表示的领域特定语言;在 DocBook 的情况下是语义标记语言)
Schematron用于根据相关的 XML 模式验证 XML 文档(我猜是使用jing
吗?)
我假设基于DocBook wikipedia行
[DocBook v5.x] 由带有集成 Schematron 规则的 RELAX NG 模式正式定义
他们之间有关系。 此外,这是否意味着 RELAX NG XML 模式不够灵活,无法包含所有规则来使用它来验证文档?
可能缺少一些基本的东西:发现问题RelaxNG vs XML schema ,但我真的认为有人用 RELAX NG 创建 XML 模式,所以这个问题对我来说没有意义,即使在阅读了答案之后......
这是http://www.oasis-open.org/docbook/xml/5.0b5/rng/docbook.rnc的紧凑语法 RELAX NG 模式的两个小片段:
element segmentedlist {
db.segmentedlist.attlist,
db.segmentedlist.info,
db.segtitle+,
db.seglistitem+
}
db.seglistitem =
## A list item in a segmented list
[
s:pattern [
name = "Cardinality of segments and titles"
"\x{a}" ~
" "
s:rule [
context = "db:seglistitem"
"\x{a}" ~
" "
s:assert [
test = "count(db:seg) = count(../db:segtitle)"
"The number of seg elements must be the same as the number of segtitle elements in the parent segmentedlist"
]
"\x{a}" ~
" "
]
"\x{a}" ~
" "
]
]
element seglistitem { db.seglistitem.attlist, db.seg+ }
db.seglistitem
RNG 模式在最外面的[
和]
之间有一些嵌入的 Schematron。
db.seglistitem
RNG 模式定义了seglistitem
元素的结构。 RNG 在定义共同约束方面比我知道的任何其他 XML 模式语言都要好,但它不能做所有事情。
Schematron 可以对文档中任何位置的出现模式(或模式出现,取决于您的观点)做出断言,因为您可以将任何 XPath 放入测试中。 此 Schematron 正在查看整个文档,以检查同级segtitle
元素的数量是否与当前seglistitem
的seg
元素的数量相匹配。 对于定义文档的允许结构的语言(如 RNG)来说,这有点类似于 scope,但您也会发现仅使用 Schematron 定义允许的结构既冗长又麻烦。
像这样结合使用 RNG 和 Schematron 可以发挥各自的优势。 (你也可以对 XSD 1.1 中的断言做同样的事情。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.