Anatomy of a complete data module
Creating your first data module describes the two halves of a
data module and then stops where s1kd-newdm stops: at an empty, schema-valid
skeleton. This page picks it up from there and shows a filled-in one, so you
can see what the elements described in the abstract actually look like carrying
real content.
The example is a procedural module — a battery replacement on a small unmanned aircraft. Procedures are the best case to read first, because they exercise the parts of S1000D that descriptive modules never touch: safety requirements, nested steps, and closing conditions.
The SkyHawk RQ-7 is a fictional aircraft, and this module is a teaching example, not a conformant deliverable. Two specific differences from a real project module:
- No schema binding. A real data module declares the S1000D schema it
validates against, and
s1kd-validateneeds that declaration. This one is plain XML so the structure stays readable. - No
brexDmRef. As Creating your first data module notes, every real data module points at the BREX that governs it.s1kd-newdmfills that in from your.defaults.
Use it to learn the shape. Generate real modules with s1kd-newdm.
The code before the content
Before reading a line of it, the filename tells you what this module is:
DMC-SHK-A-31-00-00-00A-520A-A_001-00_EN-US.XML
Decode it with the DMC decoder and it reads:
model SHK, system 31, information code 520 — a remove procedure —
issue 001, in-work 00, US English. The same fields appear again inside the file
as attributes on <dmCode>, which is the point of the scheme: the identity is
addressable from the filename and from the content, and the two must agree.
This module contains removal and installation, but 520 means remove
only — installation is the 720 family
(assemble, install, connect). A real project would usually publish these as two
data modules so a maintainer can reference "how do I install it" independently
of "how do I take it off".
Bundling them is a common shortcut in small projects and a reasonable thing to see in the wild — but it is a shortcut, and the information code is the thing that gives it away. This is exactly the kind of drift a BREX rule is written to catch.
The metadata half
identAndStatusSection answers which module is this and what state is it in.
<identAndStatusSection>
<dmAddress>
<dmIdent>
<dmCode
modelIdentCode="SHK" systemDiffCode="A"
systemCode="31" subSystemCode="0" subSubSystemCode="0"
assyCode="00" disassyCode="00" disassyCodeVariant="A"
infoCode="520" infoCodeVariant="A" itemLocationCode="A"/>
<language languageIsoCode="en" countryIsoCode="US"/>
<issueInfo issueNumber="001" inWork="00"/>
</dmIdent>
<dmAddressItems>
<issueDate year="2024" month="01" day="15"/>
<dmTitle>
<techName>Battery Pack</techName>
<infoName>Removal and Installation</infoName>
</dmTitle>
</dmAddressItems>
</dmAddress>
<dmStatus>
<security securityClassification="01"/>
<responsiblePartnerCompany><enterpriseName>TechWriter Demo</enterpriseName></responsiblePartnerCompany>
<originator><enterpriseName>TechWriter Demo</enterpriseName></originator>
<applic>
<displayText><simplePara>All SkyHawk RQ-7 variants</simplePara></displayText>
</applic>
<qualityAssurance><firstVerification verificationType="tabtop"/></qualityAssurance>
</dmStatus>
</identAndStatusSection>
Two details worth pausing on:
<dmTitle>is split in two.techNameis the thing ("Battery Pack") andinfoNameis what you are being told about it ("Removal and Installation"). Publication tools compose page titles and tables of contents from the pair, so writing the whole title intotechNamebreaks downstream output.<applic>carries applicability. Here it is prose covering every variant. On a real fleet this is where "only aircraft with mod 4471 embodied" is expressed — see Applicability.
The content half
content holds the information, and its allowed shape depends on the schema the
information code selected. A 520 resolves to the procedural schema, which has
three parts in a fixed order.
1. Preliminary requirements — what must be true first
<preliminaryRqmts>
<reqCondGroup><noConds/></reqCondGroup>
<reqSupportEquips><noSupportEquips/></reqSupportEquips>
<reqSupplies><noSupplies/></reqSupplies>
<reqSpares><noSpares/></reqSpares>
<reqSafety>
<safetyRqmts>
<warning>
<warningAndCautionPara>
Make sure that the aircraft is powered off before you remove the battery.
The propellers can cause serious injury if the motors start.
</warningAndCautionPara>
</warning>
<caution>
<warningAndCautionPara>
Do not drop the battery.
A damaged battery can catch fire.
</warningAndCautionPara>
</caution>
</safetyRqmts>
</reqSafety>
</preliminaryRqmts>
The empty elements are not filler. <noConds/>, <noSupportEquips/>,
<noSupplies/>, <noSpares/> are explicit assertions that nothing is
required — different from omitting the element, which would mean the question
was never answered. In a safety-critical document that distinction matters, and
BREX rules routinely require the positive form.
Note the placement: warnings and cautions sit in preliminaryRqmts, before any
step. A hazard that applies to the whole task belongs here, not buried at step 6.
2. Main procedure — nested steps
<proceduralStep>
<title>Removal</title>
<para>Do this procedure to remove the battery pack.</para>
<proceduralStep>
<para>Make sure that the power switch is in the OFF position.</para>
<note><notePara>The power switch is on the rear of the fuselage.</notePara></note>
</proceduralStep>
<proceduralStep>
<para>Pull the battery pack down and out of the battery bay.</para>
<caution>
<warningAndCautionPara>
Support the battery as you remove it.
Do not let the battery fall.
</warningAndCautionPara>
</caution>
</proceduralStep>
</proceduralStep>
proceduralStep nests, and the nesting is the numbering — a publication tool
derives 1, 1.1, 1.2 from the tree rather than from numbers you type. A step-local
<caution> attaches to the step it sits inside, which is how a hazard that only
applies to one action is scoped.
3. Closing requirements — how you know it worked
<closeRqmts>
<reqCondGroup>
<reqCondNoRef><reqCond>Battery is securely installed</reqCond></reqCondNoRef>
<reqCondNoRef><reqCond>Battery latch is engaged</reqCond></reqCondNoRef>
</reqCondGroup>
</closeRqmts>
The verifiable end state. A procedure that stops after the last action leaves the
maintainer with no defined way to confirm success — closeRqmts is where that is
written down.
The prose is Simplified Technical English
Read the step text again and note what it does not do. Sentences are short. Every instruction is imperative — Make sure, Pull, Hold, Push. Nothing is passive. There is no utilize, ensure, prior to, or adjacent to.
That is ASD-STE100 applied, and it is the norm for this kind of content — S1000D governs the structure, STE governs the words inside it. Paste any step above into the STE checker and it will come back clean; paste an ordinary technical rewrite of the same instruction and it will not.
Download it
DMC-SHK-A-31-00-00-00A-520A-A_001-00_EN-US.XML
Open it beside Creating your first data module and
Validating against schema & BREX. Remember it has no schema
binding, so s1kd-validate will not accept it as-is — that is the first thing to
add if you want to take it further.
Sources
- s1kd-tools — Usage examples (EXAMPLE) —
s1kd-newdm,.defaults/.dmtypes, generated file naming. - s1kd-tools — GitHub repository — the toolchain this section documents.
- ASD-STE100 — official home page — the controlled language the step text follows.