Example: Apply multiple constraints to a single document-type shell using RNG

This section is non-normative.

In this scenario, the DITA architect wants to apply multiple constraints to a document-type shell.

Example

This section is non-normative.

Here is a list of the constraint modules and what they do:

File name What it constrains Details
example-TopicConstraint.mod <topic>
  • Removes <abstract>
  • Makes <shortdesc> required
  • Removes <related-links>
  • Disallows topic nesting
example-SectionConstraint.mod <section> Makes @id required
Not applicable Highlighting domain Reduces the highlighting domain elements to <b> and <i>
Not applicable <ph> Remove the <ph> element, allowing only domain extensions

The constraint modules that target the <topic> and <section > elements must be combined, since both elements are defined in topicMod.rng. The other constraints can be implemented directly in the document-type shell.

  1. The DITA architect creates a constraint module that combines the constraints from example-TopicConstraint.mod and example-SectionConstraint.mod:

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-model href="urn:pubid:oasis:names:tc:dita:rng:vocabularyModuleDesc.rng"
                             schematypens="http://relaxng.org/ns/structure/1.0"?>
    <grammar xmlns="http://relaxng.org/ns/structure/1.0"
      xmlns:dita="http://dita.oasis-open.org/architecture/2005/"
      xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
      datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
      <div>
        <a:documentation>CONTENT MODEL AND ATTRIBUTE LIST OVERRIDES</a:documentation>
        <include href="topicMod.rng">
          <define name="section.attributes">
              <attribute name="id">
                <data type="NMTOKEN"/>
              </attribute>        
            <ref name="conref-atts"/>
            <ref name="select-atts"/>
            <ref name="localization-atts"/>
            <optional>
              <attribute name="outputclass"/>
            </optional>
          </define>
          <define name="topic.content">
            <ref name="title"/>
            <ref name="shortdesc"/>
            <optional>
              <ref name="prolog"/>
            </optional>
            <optional>
              <ref name="body"/>
            </optional>
          </define>
        </include>
      </div>
    </grammar>
  2. In the document-type shell, they integrate the constraint module (and remove the inclusion statement for topicMod.rng):

    <div>
      <a:documentation>ELEMENT-TYPE CONFIGURATION INTEGRATION</a:documentation>
      <include href="acme-SectionTopicContraintMod.rng"/>
    </div>
  3. To constrain the highlight domain, they modify the include statement for the domain module:

    <div>
      <a:documentation>MODULE INCLUSIONS</a:documentation>
      ...
      <include href="highlightDomain.rng">
        <define name="line-through.element">
          <notAllowed/>
        </define>
        <define name="overline.element">
          <notAllowed/>
        </define>
        <define name="sub.element">
          <notAllowed/>
        </define>
        <define name="sup.element">
          <notAllowed/>
        </define>
        <define name="tt.element">
          <notAllowed/>
        </define>
        <define name="u.element">
          <notAllowed/>
        </define>
      </include>
      ..  
    </div>
  4. Finally, to disallow <ph>, they add the following statement to the constraint module:
          <define name="ph.element">
            <notAllowed/>
          </define>