Documentation
Elements
- <a>
- <altRepresentation>
- <aside>
- <assessment>
- <author>
- <backcover>
- <blockquote>
- <body>
- <bodymatter>
- <caption>
- <code>
- <cover>
- <dd>
- <dl>
- <document>
- <dt>
- <em>
- <figure>
- <figureGroup>
- <frame>
- <frontcover>
- <frontmatter>
- <hd>
- <img>
- <indicators>
- <input>
- <jacketcopy>
- <legend>
- <li>
- <line>
- <linegroup>
- <list>
- <meta>
- <metadata>
- <note>
- <noteRef>
- <p>
- <pagebreak>
- <poem>
- <publication>
- <pullquote>
- <rearmatter>
- <section>
- <source>
- <span>
- <sub>
- <subtitle>
- <sup>
- <table>
- <tbody>
- <td>
- <tfoot>
- <th>
- <thead>
- <title>
- <tr>
Schematron – quality checks
Status: Concept This Schematron is a work in progress. Feedback is very welcome, please raise issues or suggestions with the MONET editorial team so we can improve the ruleset together.
The MONET Schematron is a set of automated editorial checks that runs alongside the XSD validation. Where the XSD verifies structure (which elements are allowed where, which attributes are required), the Schematron verifies conventions and semantic quality (naming patterns, cross- reference integrity, misuse of styling elements, and so on).
Together they raise the baseline quality of every MONET production.
Enable it in your XML
There are two ways to activate the Schematron on your MONET files. Pick whichever fits your workflow best.
Option A: Inline processing instruction (per file)
Add the following line at the top of your XML, directly after the <?xml version="1.0" encoding="UTF-8"?> declaration:
<?xml-model href="https://epubshowcase.dedicontest.nl/schematron/monet-checks.sch" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>
Oxygen (and most modern XML editors) will automatically fetch and apply the Schematron whenever the file is opened or validated.
Option B: Validation scenario in Oxygen (per project)
For repeated use across many files, add the Schematron as a validation scenario in Oxygen:
- Options → Preferences → Editor → Edit Modes → Author → Validation Scenarios (or via the Document Type Association for MONET)
- New → Schematron
- Schema URI:
https://epubshowcase.dedicontest.nl/schematron/monet-checks.sch - Save. The Schematron now runs automatically on every MONET file.
Errors and warnings appear in the same panel as XSD validation messages.
Handling errors and warnings
Every check has a severity, either error or warning, and each is meant to be handled differently.
Errors signal that a rule has been broken. They should be resolved as much as possible before a production is delivered. An error indicates a real problem: a broken cross-reference, an incorrect naming pattern, a structural mismatch, or a convention that our downstream tooling depends on. Leaving errors in place will cause issues later in the pipeline. For now, you are not prohibited to deliver us a file with errors but please review each error the best you can.
Warnings are less strict. They serve as a moment to pause and check whether the current markup really reflects the author’s intent. In many cases a warning is a valid choice, but sometimes it exposes a mistake that only becomes visible when you look twice. Review each warning, decide whether to change or keep the markup, and move on. Warnings are not blocking.
If you disagree with a rule, either because it triggers where it shouldn’t, or because it doesn’t trigger where it should please share that feedback so we can adjust.
What the Schematron checks
Grouped by topic. Every check has a severity: error blocks approval; warning flags something for review but is not blocking.
Cross-references and links
| # | Rule | Severity | Description |
|---|---|---|---|
| 1 | pageref-missing-hash | error | <a type="pageRef"> href must start with # (e.g. href="#pb-42"). |
| 2 | broken-pageref | error | <a type="pageRef" href="#pb-X"> must resolve to an existing <pagebreak id="pb-X">. |
| 3 | exref-not-external | error | <a type="exRef"> href must start with http://, https://, or mailto:. |
| 4 | empty-href | error | <a> may not have href="". |
Naming conventions
| # | Rule | Severity | Description |
|---|---|---|---|
| 5 | note-id-pattern | error | <note> @id must match note-N (e.g. note-1, note-42). |
| 6 | input-id-pattern | error | <input> @id must match input-N. |
| 7 | pagebreak-id-pattern | error | <pagebreak> @id must match pb-N (digits only after pb-). |
| 8 | pagebreak-id-matches-content | error | The number in @id must match the page-number text: <pagebreak id="pb-42">42</pagebreak>. |
Language
| # | Rule | Severity | Description |
|---|---|---|---|
| 9 | redundant-xml-lang | error | xml:lang on an element with an ancestor that already declares the same value is redundant. |
Emphasis
| # | Rule | Severity | Description |
|---|---|---|---|
| 10 | em-is-whole-p | warning | When <em> is the entire content of a <p>, move the style to <p fontStyles="..."> instead. |
| 11 | em-in-em | warning | Nested <em> is redundant. |
| 12 | em-contains-block | error | <em> may not contain block-level elements (<p>, <list>, <table>, <figure>, <blockquote>, <hd>, <frame>, <assessment>, <section>). |
Lists
| # | Rule | Severity | Description |
|---|---|---|---|
| 13 | unordered-list-needs-bullettype | error | <list listType="unordered"> must have @bulletType. |
| 14 | unordered-list-no-numbertype | error | <list listType="unordered"> must not have @numberType. |
| 15 | ordered-list-no-bullettype | error | <list listType="ordered"> must not have @bulletType. |
| 16 | startnumber-only-on-numeric | error | @startNumber is only valid on ordered numeric lists. |
Tables
| # | Rule | Severity | Description |
|---|---|---|---|
| 17 | td-fontstyles | warning | <td fontStyles="..."> — if it’s a header cell, use <th> instead. |
| 18 | th-fontstyles | warning | <th fontStyles="..."> — <th> already carries the header-cell semantics; the attribute is redundant. |
Notes
| # | Rule | Severity | Description |
|---|---|---|---|
| 19 | orphan-note | error | Every <note> must be referenced by at least one <noteRef idRef="…">. |
Structure
| # | Rule | Severity | Description |
|---|---|---|---|
| 20 | section-nesting-level | error | A nested <section> must have a @level greater than its parent’s. |
| 21 | section-level-skip | warning | Best practice: nest sections exactly one level deeper (level="1" → level="2", not level="1" → level="3"). |
| 22 | empty-hd | warning | Empty <hd> elements render as blank lines and disrupt reading flow. |
Feedback
This is a concept ruleset. If a check is too strict, too lax, misses an edge case, or produces confusing messages: let us know. Contact the MONET editorial team, every ruleset improvement helps every production.
Changelog
2026-09 — Initial release
- 22 checks across 8 topics
- All rules run alongside the existing MONET XSD validation
- Bundled examples and how-to-enable documentation