RELAX NG + Schematron

db.book =
  [
    s:rule [
      context = "/db:book"
      s:assert [
        test = "@version"
        "The root element must have a version attribute."
      ]
    ]
  ]
  element book {
    book.attlist,
    book.info,
    (navigation.components | components | divisions)+
  }

There are validators that will enforce both sets of constraints.