Example: Aggregating constraint and expansion modules using RNG
This section is non-normative.
The DITA architect wants to add some extension modules to the document-type shell for topic. The document-type shell already integrates a constraint module.
The following table lists the constraint module and the extension modules that the DITA architect wants to integrate into the document-type shell for topic.
Type of element configuration | File name | What it does |
---|---|---|
Constraint | topicSectionConstraint.rng |
Constrains
Constrains
|
Expansion | sectionExpansionMod.rng | Adds <sectionDesc> to the content
model of <section> |
Expansion | tableCellAttExpansion.rng | Adds @cellPurpose to the attribute lists
for certain table elements |
Because all of these element-configuration modules target elements declared in topicMod.rng, the DITA architect needs to combine them into a single element-configuration module like the following:
<?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="urn:pubid:oasis:names:tc:dita:rng:topicMod.rng:2.0">
<!-- Redefines attribute list for section: Makes @id required -->
<define name="section.attributes">
<attribute name="id">
<data type="ID"/>
</attribute>
<ref name="conref-atts"/>
<ref name="select-atts"/>
<ref name="localization-atts"/>
<optional>
<attribute name="outputclass"/>
</optional>
</define>
<!-- Adds sectionDesc to the content model of section -->
<define name="section.content">
<optional>
<ref name="title"/>
</optional>
<optional>
<ref name="sectionDesc"/>
</optional>
<zeroOrMore>
<ref name="section.cnt"/>
</zeroOrMore>
</define>
<!-- Adds @cellPurpose to certain table and simple table elements -->
<define name="colspec.attributes" combine="interleave">
<optional>
<attribute name="cellPurpose"/>
</optional>
</define>
<define name="entry.attributes" combine="interleave">
<optional>
<attribute name="cellPurpose"/>
</optional>
</define>
<define name="row.attributes" combine="interleave">
<optional>
<attribute name="cellPurpose"/>
</optional>
</define>
<define name="stentry.attributes" combine="interleave">
<optional>
<attribute name="cellPurpose"/>
</optional>
</define>
<define name="strow.attributes" combine="interleave">
<optional>
<attribute name="cellPurpose"/>
</optional>
</define>
<!-- Redefines topic: removes abstract and related-links; makes shortdesc -->
<!-- required; disallows topic nesting -->
<define name="topic.content">
<ref name="title"/>
<ref name="shortdesc"/>
<optional>
<ref name="prolog"/>
</optional>
<optional>
<ref name="body"/>
</optional>
</define>
</include>
</div>
</grammar>
When the DITA architect edits the document-type shell to integrate the element configuration module, they also need to do the following:
- Remove the include statement for topicMod.rng
- Add
<section>
to the "ID-DEFINING ELEMENT OVERRIDES" division