Expansion modules
This section is non-normative.
This section of the specification contains examples of expansion modules implemented using both DTD and RNG.
Examples: Expansion implemented using DTDs
This section is non-normative.
This section of the specification contains examples of extension modules that are implemented using DTDs.
Example: Adding an element to the <section>
element using DTDs
This section is non-normative.
In this scenario, a DITA architect wants to modify the content
model for the <section>
element. The DITA
architect wants to add an optional <sectionDesc>
element that is specialized from
<p>
.
Example
This section is non-normative.
To accomplish this, the DITA architect needs to create the following modules and integrate them into the document-type shell:
- An element-domain specialization module
that defines the
<sectionDesc>
element - An expansion module that adds the
<sectionDesc>
element to the content model for<section>
- First, the DITA architect creates the element specialization
module: sectionDescDomain.mod. This single
.mod file defines the parameter entity,
content model, attributes, and value for the
@class
attribute for<sectionDesc>
.<?xml version="1.0" encoding="UTF-8"?> <!ENTITY % sectionDesc "sectionDesc"> <!ENTITY % sectionDesc.content "(%para.cnt;)*"> <!ENTITY % sectionDesc.attributes "%univ-atts;"> <!ELEMENT sectionDesc %sectionDesc.content;> <!ATTLIST sectionDesc %sectionDesc.attributes;> <!ATTLIST sectionDesc class CDATA "+ topic/p sectionDesc-d/sectionDesc ">
- The DITA architect adds the element specialization module to the catalog.xml file.
- Next, the DITA architect modifies the applicable document-type
shell to integrate the applicable element specialization
module:
<!-- ============================================================= --> <!-- DOMAIN ELEMENT INTEGRATION --> <!-- ============================================================= --> <!-- ... other domains ... --> <!ENTITY % sectionDesc-d-def PUBLIC "-//ACME//ELEMENTS DITA 2.0 Section Description Domain//EN" "sectionDescDomain.mod" >%sectionDesc-d-def;
At this point, the new domain is integrated into the topic document-type shell. However, the new element is not added to the content model for
<section>
. - Next, the DITA architect creates an expansion module:
acme-SectionExpansion.mod. This module adds the
<sectionDesc>
element to the content model of<section>
.<?xml version="1.0" encoding="UTF-8"?> <!-- Declares the entities referenced in the modified content --> <!-- model. --> <!ENTITY % dl "dl"> <!ENTITY % div "div"> <!ENTITY % fig "fig"> <!ENTITY % image "image"> <!ENTITY % lines "lines"> <!ENTITY % lq "lq"> <!ENTITY % note "note"> <!ENTITY % object "object"> <!ENTITY % ol "ol"> <!ENTITY % p "p"> <!ENTITY % pre "pre"> <!ENTITY % simpletable "simpletable"> <!ENTITY % sl "sl"> <!ENTITY % table "table"> <!ENTITY % ul "ul"> <!ENTITY % cite "cite"> <!ENTITY % include "include"> <!ENTITY % keyword "keyword"> <!ENTITY % ph "ph"> <!ENTITY % q "q"> <!ENTITY % term "term"> <!ENTITY % text "text"> <!ENTITY % tm "tm"> <!ENTITY % xref "xref"> <!ENTITY % data "data"> <!ENTITY % foreign "foreign"> <!ENTITY % title "title"> <!ENTITY % draft-comment "draft-comment"> <!ENTITY % fn "fn"> <!ENTITY % indexterm "indexterm"> <!ENTITY % required-cleanup "required-cleanup"> <!ENTITY % sectionDesc "sectionDesc"> <!-- Defines the modified content model for <section>. --> <!ENTITY % section.content "(#PCDATA | %dl; | %div; | %fig; | %image; | %lines; | %lq; | %note; | %object; | %ol; | %p; | %pre; | %simpletable; | %sl; | %table; | %ul; | %cite; | %include; | %keyword; | %ph; | %q; | %term; | %text; | %tm; | %xref; | %data; | %foreign; | %title; | %draft-comment; | %fn; | %indexterm; | %required-cleanup; | %sectionDesc;)*" >
Note that the DITA architect needed to explicitly declare all the elements, rather than using the
%section.cnt;
parameter entity that is used in the definition of<section>
. Because the element-configuration modules are integrated into the document-type shell before the base grammar modules, none of the parameter entities that are used in the base DITA vocabulary modules are available. - Finally, the DITA architect integrates the expansion module
into the document-type
shell:
<!-- ============================================================= --> <!-- ELEMENT-TYPE CONFIGURATION INTEGRATION --> <!-- ============================================================= --> <!-- Other constraint and expansion modules --> <!ENTITY % acmeSection-def PUBLIC "-//ACME//ELEMENTS DITA 2.0 Section Expansion//EN" "acme-SectionExpansion.mod" >%acmeSection-def;
- After updating the catalog.xml file to include the expansion module and testing it, the work is done.
Example: Adding an attribute to certain table elements using DTDs
This section is non-normative.
In this scenario, a company makes extensive use of complex tables to present product listings. They occasionally highlight individual cells, rows, or columns for various purposes. The DITA architect wants to implement a semantically meaningful way to identify the purpose of various table elements.
The DITA architect decides to create a new attribute
(@cell-purpose
) and add it to the attribute lists
of the following elements:
<colspec>
<entry>
<row>
<stentry>
<strow>
The new attribute will be specialized from @base
,
and it will take a small set of tokens as values.
The DITA architect decides to integrate the attribute declaration and its assignment to elements into a single expansion module. An alternate approach would be to put each attribute-list pattern in its own separate expansion module, thus allowing DITA architects who construct document-type shells to decide the elements to which to apply the attribute.
- First,
the DITA architect creates the expansion module for the
@cell-purpose
attribute: acme-cellPurposeAttExpansion.ent.<!-- Define the attribute --> <!ENTITY % cellPurposeAtt-d-attribute-expansion "cell-purpose (sale | out-of-stock | new | last-chance | inherit | none) #IMPLIED" > <!-- Declare the entity to be used in the @specializations attribute --> <!ENTITY cellPurposeAtt-d-att "@base/cell-purpose" > <!-- Add the attribute to the elements. --> <!ATTLIST entry %cellPurposeAtt-d-attribute-expansion;> <!ATTLIST row %cellPurposeAtt-d-attribute-expansion;> <!ATTLIST colspec %cellPurposeAtt-d-attribute-expansion;> <!ATTLIST strow %cellPurposeAtt-d-attribute-expansion;> <!ATTLIST stentry %cellPurposeAtt-d-attribute-expansion;>
Note (non-normative):The attribute definition entity is optional. It is used here to enable the DITA architect to add the same attribute with the same tokens to several elements. - They then update the catalog.xml file to include the expansion module.
- They integrate this module into the applicable
document-type
shell.
<!-- ============================================================= --> <!-- DOMAIN ATTRIBUTES DECLARATIONS --> <!-- ============================================================= --> <!-- ... other domains ... --> <!ENTITY % cellPurposeAttExpansion-d-dec PUBLIC "-//ACME//ENTITIES DITA Cell Purpose Attribute Expansion//EN" "cellPurposeAttExpansion.ent" >%cellPurposeAttExpansion-d-dec;
- They add the entity for the contribution to
the
@specializations
attribute.<!-- ============================================================= --> <!-- SPECIALIZATIONS ATTRIBUTE OVERRIDE --> <!-- ============================================================= --> <!ENTITY included-domains "&audienceAtt-d-att; &cellPurposeAtt-d-att; &deliveryTargetAtt-d-att; &otherpropsAtt-d-att; &platformAtt-d-att; &productAtt-d-att;" >
- After checking the test topic to ensure that the attribute lists are modified as expected, the work is done.
Example: Adding an existing domain attribute to certain elements using DTDs
This section is non-normative.
In this scenario, a company wants to use the
@otherprops
attribute specialization. However, they
want to make the attribute available only on certain elements:
<p>
, <div>
, and
<section>
.
The DITA architect will need to create an extension module and integrate it into the appropriate document-type shells.
-
The DITA architect creates an expansion module that adds the
@otherprops
attribute to the selected elements: acme-otherpropsAttExpansion.mod. The expansion module contains the following code:<?xml version="1.0" encoding="UTF-8"?> <!-- Add the otherprops attribute to certain elements --> <!ATTLIST p %otherpropsAtt-d-attribute;> <!ATTLIST div %otherpropsAtt-d-attribute;> <!ATTLIST section %otherpropsAtt-d-attribute;>
Note that the
%otherpropsAtt-d-attribute;
is defined in the separate attribute-specialization module that defines the@otherprops
attribute. - They then update the catalog.xml file to include the expansion module.
- They integrate the extension module into the applicable
document-type shell, after the declaration for the
@otherprops
attribute-specialization module:<!-- ============================================================= --> <!-- DOMAIN ATTRIBUTES DECLARATIONS --> <!-- ============================================================= --> ... <!ENTITY % otherpropsAtt-d-dec PUBLIC "-//OASIS//ENTITIES DITA 2.0 Otherprops Attribute Domain//EN" "otherpropsAttDomain.ent" >%otherpropsAtt-d-dec; <!ENTITY % otherprops-expansion-e-def PUBLIC "-//ACME//DITA 2.0 Otherprops Expansion//EN" "acme-otherpropsAttExpansion.mod" >%otherprops-expansion-e-def; ...
-
They remove the reference to the
@otherprops
attribute from theprops-attribute-extension
entity:<!-- ============================================================= --> <!-- DOMAIN ATTRIBUTE EXTENSIONS --> <!-- ============================================================= --> <!ENTITY % base-attribute-extensions "" > <!ENTITY % props-attribute-extensions "%audienceAtt-d-attribute; %deliveryTargetAtt-d-attribute; %otherpropsAtt-d-attribute; %platformAtt-d-attribute; %productAtt-d-attribute;" >
- They ensure that the
included-domains
entity contains the@otherprops
contribution to the@specializations
attribute:<!-- ============================================================= --> <!-- SPECIALIZATIONS ATTRIBUTE OVERRIDE --> <!-- ============================================================= --> <!ENTITY included-domains "&audienceAtt-d-att; &deliveryTargetAtt-d-att; &otherpropsAtt-d-att; &platformAtt-d-att; &productAtt-d-att;" >
- After checking the test topic to ensure that the attribute lists are modified as expected, the work is done.
Example: Aggregating constraint and expansion modules using DTDs
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 number of constraint modules.
The following table lists the constraints that are currently integrated into the document-type shell:
File name | What it constrains | Details |
---|---|---|
example-TopicConstraint.mod | <topic> |
|
example-SectionConstraint.mod | <section> |
|
example-HighlightingDomainConstraint.mod | Highlighting domain | Reduces the highlighting domain elements to
<b> and
<i> |
The following table lists the expansion modules that the DITA architect wants to add to the document-type shell:
File name | What it modifies | Details |
---|---|---|
acme-SectionExpansion.mod | <section> |
Adds an optional <sectionDesc>
element to <section> . |
example-dlentryModeAttExpansion.ent | <dlentry> |
Adds @dlentryMode to the attributes of
<dlentry> . |
The constraint and expansion modules that target the
<section>
element must be combined into a
single element-configuration module. An element can only be targeted
by a single element-configuration module.
Examples: Expansion implemented using RNG
This section is non-normative.
This section of the specification contains examples of extension modules implemented using RNG.
Example: Adding an element to the <section>
element using RNG
This section is non-normative.
In this scenario, a DITA architect wants to modify the content
model for the <section>
element. He wants to add
an optional <sectionDesc>
element that is
specialized from <p>
; the
<sectionDesc>
can occur once and must be
directly after the section title.
Example
This section is non-normative.
To accomplish this, the DITA architect needs to create the following modules and integrate them into the document-type shells:
- An element domain module that defines the
<sectionDesc>
element - An expansion module that adds the
<sectionDesc>
element to the content model for<section>
- First, the DITA architect creates the element domain module:
sectionDescDomain.rng. It contains the
following
code:
<?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:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns:dita="http://dita.oasis-open.org/architecture/2005/" xmlns="http://relaxng.org/ns/structure/1.0"> <div> <a:documentation>DOMAIN EXTENSION PATTERNS</a:documentation> </div> <div> <a:documentation>ELEMENT TYPE NAME PATTERNS</a:documentation> <define name="sectionDesc"> <ref name="sectionDesc.element"/> </define> </div> <div> <a:documentation>ELEMENT TYPE DECLARATIONS</a:documentation> <div> <a:documentation>LONG NAME: Section Description</a:documentation> <define name="sectionDesc.content"> <zeroOrMore> <ref name="para.cnt"/> </zeroOrMore> </define> <define name="sectionDesc.attributes"> <ref name="univ-atts"/> </define> <define name="sectionDesc.element"> <element name="sectionDesc" dita:longName="Section Description"> <a:documentation/> <ref name="sectionDesc.attlist"/> <ref name="sectionDesc.content"/> </element> </define> <define name="sectionDesc.attlist" combine="interleave"> <ref name="sectionDesc.attributes"/> </define> </div> </div> <div> <a:documentation>SPECIALIZATION ATTRIBUTE DECLARATIONS</a:documentation> <define name="sectionDesc.attlist" combine="interleave"> <optional> <attribute name="class" a:defaultValue="+ topic/p sectionDesc-d-p/sectionDesc "/> </optional> </define> </div> </grammar>
- The DITA architect adds the element domain module to the catalog.xml file.
-
Next, the DITA architect modifies the document-type shell (in this example, the one for topic) to integrate the element domain module:
<div> <a:documentation>MODULE INCLUSIONS</a:documentation> ... <include href="urn:pubid:example:names:tc:dita:rng:sectionDescDomain.rng:2.0"/> </div>
At this point, the new domain is integrated into the document-type shell. However, the new element is not added to the content model for
<section>
. -
Next, the DITA architect created an expansion module (sectionExpansionMod.rng) that adds the
<sectionDesc>
element to the content model of<section>
:<?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"> <define name="topic-info-types"> <ref name="topic.element"/> </define> <define name="section.content"> <optional> <ref name="title"/> </optional> <optional> <ref name="sectionDesc"/> </optional> <zeroOrMore> <ref name="section.cnt"/> </zeroOrMore> </define> </include> </div> </grammar>
Note that the expansion module directly integrates topicMod.rng.
-
Finally, the DITA architect integrates the expansion module into the document-type shell and removes the inclusion statement for topicMod.rng:
<div> <a:documentation>ELEMENT-TYPE CONFIGURATION INTEGRATION</a:documentation> <include href="sectionExpansionMod.rng"/> </div> <div> <a:documentation>MODULE INCLUSIONS</a:documentation> <include href="urn:pubid:oasis:names:tc:dita:rng:topicMod.rng:2.0"> <define name="topic-info-types"> <ref name="topic.element"/> </define> </include> ... <include href="urn:pubid:example:names:tc:dita:rng:sectionDescDomain.rng:2.0"/> </div>
- After updating the catalog.xml file to include the expansion module and testing, the work is done.
Example: Adding an attribute to certain table elements using RNG
This section is non-normative.
In this scenario, a company makes extensive use of complex tables to present product listings. They occasionally highlight individual cells, rows, or columns for various purposes. The DITA architect wants to implement a semantically meaningful way to identify the purpose of various table elements.
The DITA architect decides to create a new attribute
(@cell-purpose
) and add it to the content model of
the following elements:
<entry>
<row>
<colspec>
<stentry>
<strow>
The new attribute will be specialized from @base
,
and it will take a small set of tokens as values.
The DITA architect decides to integrate the attribute declaration
and its assignment to elements into a single expansion module. An
alternate approach would be to put each <!ATTLIST
declaration in its own separate expansion module, thus allowing DITA
architects who construct document-type shells to decide the elements
to which to apply the attribute.
-
The DITA architect creates an expansion module: cellPurposeAtt.rng. It contains the following code:
<?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:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns:dita="http://dita.oasis-open.org/architecture/2005/" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> <!-- DEFINE THE ATTRIBUTE SPECIALIZATION --> <define name="cellPurposeAtt"> <optional> <attribute name="cellPurpose"> <a:documentation>Specifies the purpose of the table cell. This is a specialized attribute for Acme Corporation. </a:documentation> <choice> <value>sale</value> <value>out-of-stock</value> <value>new</value> <value>last-chance</value> <value>inherit</value> <value>none</value> </choice> </attribute> </optional> </define> <!-- ASSIGN THE ATTRIBUTE TO CERTAIN ELEMENTS --> <define name="entry.attributes" combine="interleave"> <ref name="cellPurposeAtt"/> </define> <define name="stentry.attributes" combine="interleave"> <ref name="cellPurposeAtt"/> </define> <define name="row.attributes" combine="interleave"> <ref name="cellPurposeAtt"/> </define> <define name="strow.attributes" combine="interleave"> <ref name="cellPurposeAtt"/> </define> <define name="colspec.attributes" combine="interleave"> <ref name="cellPurposeAtt"/> </define> </grammar>
-
They then update the catalog.xml file to include the expansion module.
-
They integrate the expansion module into the document-type shell:
<div> <a:documentation>MODULE INCLUSIONS</a:documentation> ... <include href="urn:pubid:example:names:tc:dita:rng:cellPurposeAtt.rng:2.0"/> </div>
- They specify the value that the
@cellPurpose
attribute contributes to the@specializations
attribute:<div> <a:documentation>SPECIALIZATIONS ATTRIBUTE</a:documentation> <define name="specializations-att"> <optional> <attribute name="specializations" a:defaultValue=" @props/audience @props/deliveryTarget @props/otherprops @props/platform @props/product @base/cellPurpose"/> </optional> </define> </div>
- After checking the test file to ensure that the attribute lists are modified as expected, the work is done.
Example: Adding an existing domain attribute to certain elements using RNG
This section is non-normative.
In this scenario, a company wants to use the
@otherprops
attribute specialization. However, they
want to make the attribute available only on certain elements:
<p>
, <div>
, and
<section>
.
The DITA architect will need to create an extension module and integrate it into the appropriate document-type shells.
-
The DITA architect creates an expansion module that adds the
@otherprops
attribute to the selected elements: acme-otherpropsAttExpansion.rng. The expansion module contains the following content:<?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:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns:dita="http://dita.oasis-open.org/architecture/2005/" 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"> <define name="topic-info-types"> <ref name="topic.element"/> </define> <define name="p.attributes" combine="interleave"> <optional> <attribute name="otherprops"/> </optional> </define> <define name="div.attributes" combine="interleave"> <optional> <attribute name="otherprops"/> </optional> </define> <define name="section.attributes" combine="interleave"> <optional> <attribute name="otherprops"/> </optional> </define> </include> </div> </grammar>
- They then update the catalog.xml file to include the expansion module.
-
They integrate the extension module into the applicable document-type shell, and remove the
<include>
element for topicMod.rng:<div> <a:documentation>ELEMENT-TYPE CONFIGURATION INTEGRATION</a:documentation> <include href="acme-otherpropsAttExpansion.rng"/> </div> <div> <a:documentation>MODULE INCLUSIONS</a:documentation> <include href="urn:pubid:oasis:names:tc:dita:rng:topicMod.rng:2.x"/> ... <include href="urn:pubid:oasis:names:tc:dita:rng:otherpropsAttDomain.rng:2.0"> </include> </div>
-
They remove the reference to the
@otherprops
attribute from theprops-attribute-extension
pattern:<div> <a:documentation>MODULE INCLUSIONS</a:documentation> ... <include href="urn:pubid:oasis:names:tc:dita:rng:otherpropsAttDomain.rng:2.0"> <define name="props-attribute-extensions" combine="interleave"> <empty/> </define> </include>
-
They ensure that the
included-domains
entity contains the@otherprops
contribution to the@specializations
attribute:<div> <a:documentation>SPECIALIZATIONS ATTRIBUTE</a:documentation> <define name="specializations-att"> <optional> <attribute name="specializations" a:defaultValue=" @props/audience @props/deliveryTarget @props/otherprops @props/platform @props/product"/> </optional> </define> </div>
- After checking the test topic to ensure that the attribute lists are modified as expected, the work is done.
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