Xml RELAX NG和Schematron wrt DocBook之间的关系是什么?

Xml RELAX NG和Schematron wrt DocBook之间的关系是什么?,xml,docbook,schematron,relaxng,Xml,Docbook,Schematron,Relaxng,我很确定这个问题需要改进,但我无法用一句话更好地表达我的困惑: 声明 从DocBookV5.0开始,DocBook是一个专门使用RELAXNG和Schematron定义的XML词汇表 根据,它是一种“XML模式语言——RELAXNG模式指定XML文档的结构和内容模式” “是一种基于规则的验证语言,用于断言XML树中是否存在模式。它是一种用XML表示的结构化架构语言。” 这两种语言都是模式语言,但是 RELAX NG用于定义用于创建XML文档的词汇表(这是一种用标记(?)表示的特定于领域的语言;

我很确定这个问题需要改进,但我无法用一句话更好地表达我的困惑:

声明

从DocBookV5.0开始,DocBook是一个专门使用RELAXNG和Schematron定义的XML词汇表

根据,它是一种“XML模式语言——RELAXNG模式指定XML文档的结构和内容模式”

“是一种基于规则的验证语言,用于断言XML树中是否存在模式。它是一种用XML表示的结构化架构语言。”

这两种语言都是模式语言,但是

  • RELAX NG用于定义用于创建XML文档的词汇表(这是一种用标记(?)表示的特定于领域的语言;DocBook是一种语义标记语言)

  • Schematron用于根据XML文档关联的XML模式验证XML文档(例如,我想使用?)

我是根据这条线假设的

[DocBook v5.x]由一个带有集成Schematron规则的RELAXNG模式正式定义

他们之间有关系。此外,这是否意味着RELAXNG XML模式不够灵活,无法包含用于验证文档的所有规则



可能遗漏了一些基本的东西:找到了问题,但我真的认为可以使用RELAX NG创建XML模式,因此即使在阅读了答案之后,这个问题对我来说也没有意义…

以下是精简语法RELAX NG模式的两个小摘录:

db.seglistitem
RNG模式在最外层的
[
]
之间有一些嵌入式Schematron

db.seglistitem
RNG模式定义了
seglistitem
元素的结构。据我所知,RNG在定义共同约束方面比任何其他XML模式语言都要好,但它不能做所有事情

Schematron可以在文档中的任何位置对出现的模式(或模式的出现,取决于您的视角)进行断言,因为您可以在测试中放置任何XPath。此Schematron正在查看文档,以检查同级
segtile
元素的数量是否与当前
seglistitem
seg
元素的数量匹配。对于像RNG这样定义文档允许的结构的语言来说,这有点超出了范围,但是您也会发现仅使用Schematron定义允许的结构既冗长又麻烦


像这样结合使用RNG和Schematron,可以利用它们各自的优势。(您也可以对XSD 1.1中的断言执行相同的操作。)

感谢您的编辑和回答!我还重新阅读了DocBook手册(有问题的链接)的第1章,找到了“一些附加约束用Schematron规则表示”这句话,这句话本来可以回答我的问题,但Tony下面的回答甚至给出了一些示例,我们也非常感谢您的详细解释。
    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+ }