ddn.data.xml.relaxng

Relax NG 1.0 validation.

This module provides a native Relax NG representation and validator.

Supported patterns:

  • element (with @name or name classes anyName/nsName/choice with optional except)
  • attribute (with @name or name classes)
  • text, empty, data, value
  • group, choice, interleave
  • optional, zeroOrMore, oneOrMore
  • mixed, list
  • notAllowed
  • grammar with start, define, and ref
  • Recursive grammar definitions

Supported datatypes (XSD subset):

  • string, token, boolean, int/integer, decimal, float, double, date, dateTime, time, anyURI, NMTOKEN, NMTOKENS, ID, IDREF

Remaining limitations:

  • include and externalRef are not supported
  • combine attribute on define is not supported
  • datatypeLibrary attribute is acknowledged but only the built-in XSD type set is validated
  • Namespace-qualified element/attribute name matching uses lexical names only (no namespace expansion in pattern names)

Types 7

Relax NG pattern kind.

ELEMENTElement pattern.
EMPTYEmpty pattern.
ATTRIBUTEAttribute pattern.
TEXTText pattern.
DATADatatype pattern.
GROUPGroup (sequence) pattern.
CHOICEChoice pattern.
INTERLEAVEInterleave pattern.
OPTIONALOptional pattern.
ZERO_OR_MOREZero-or-more repetition.
ONE_OR_MOREOne-or-more repetition.
NOT_ALLOWEDNot-allowed pattern.
REFRef pattern (reference to a grammar definition).
MIXEDMixed pattern (interleave of text with child patterns).
LISTList pattern (whitespace-separated tokens).
VALUEValue pattern (literal value matching).

Relax NG name class kind.

NAMESimple name match.
ANY_NAMEAny-name wildcard with optional except.
NS_NAMENamespace-name wildcard with optional except.
CHOICEChoice of name classes.

Relax NG name class.

Fields
RelaxNgNameClassKind kindName class kind.
string valueName for `NAME` kind, namespace URI for `NS_NAME` kind.
RelaxNgNameClass[] alternativesChoice alternatives (for `CHOICE` kind).
RelaxNgNameClass * exceptExcept name class (for `ANY_NAME` and `NS_NAME`). Heap-allocated to break self-reference.

Relax NG pattern.

Fields
RelaxNgPatternKind kindPattern kind.
string nameName for `ELEMENT`, `ATTRIBUTE`, `DATA`, `VALUE`, `REF` patterns.
RelaxNgPattern[] childrenChild patterns.
RelaxNgNameClass nameClassName class for `ELEMENT` and `ATTRIBUTE` patterns.

Relax NG grammar.

Fields
RelaxNgPattern rootRoot pattern.
RelaxNgPattern[string] definitionsNamed definitions (for `ref` resolution).

Result of validating a document against a Relax NG grammar.

Fields
bool valid`true` if valid.
string messageOptional error message if invalid.
private aliasDefs = const(RelaxNgPattern)[string]

Functions 34

fnRelaxNgGrammar parseRelaxNg(string rngXml) @safeParses a Relax NG schema document.
private fnvoid resolveRefs(ref RelaxNgGrammar g) @safe
private fnRelaxNgNameClass * findExcept(XmlElement el) @safe
private fnRelaxNgPattern[] parseImplicitGroupChildren(XmlElement parent, bool skipNameClass = false) @safe
private fnbool isNameClassElement(XmlElement el) @safe
fnRelaxNgValidationResult validateRelaxNgDocument(XmlDocument doc, RelaxNgGrammar grammar) @safeValidates `doc` against `grammar`.
private fnRelaxNgPattern deepCopyPattern(const RelaxNgPattern p) @trusted
private fnRelaxNgPattern[] deepCopyPatterns(const RelaxNgPattern[] arr) @trusted
private fnbool matchPattern(RelaxNgPattern pattern, XmlElement el, out string message, Defs defs) @safe
private fnbool isAttributeOnlyPattern(RelaxNgPattern p) @safe pure
private fnbool matchAttributePatterns( RelaxNgPattern[] patterns, XmlElement el, out string message, Defs defs) @safe
private fnbool matchAttributePatternSet( RelaxNgPattern p, XmlElement el, out string message, Defs defs) @safe
private fnbool containsOnlyAttributes(RelaxNgPattern p) @safe pure
private fnvoid extractAttributes( RelaxNgPattern p, ref RelaxNgPattern[] attrs, ref RelaxNgPattern[] content) @safe
private fnbool matchNameClass(RelaxNgNameClass nc, string fallbackName, string actualName) @safe
private fnbool matchAttributePattern(RelaxNgPattern pattern, XmlElement el, out string message, Defs defs) @safe
private fnbool validateData(string type, string value, out string message) @safe
private fnstring textValue(XmlElement el) @safe
private fnbool hasNonWhitespaceText(XmlElement el) @safe nothrow
private fnbool canMatchEmpty(RelaxNgPattern p) @safe
private fnRelaxNgPattern derive(RelaxNgPattern p, XmlElement el, Defs defs) @safe
private fnsize_t[] matchSequence(RelaxNgPattern[] patterns, XmlElement[] children, size_t pos, Defs defs) @safe
private fnsize_t[] matchConsume(RelaxNgPattern pattern, XmlElement[] children, size_t pos, Defs defs) @safe
private fnbool matchContentPattern(RelaxNgPattern pattern, XmlElement el, out string message, Defs defs) @safe
private fnstring[] splitTokens(string s) @safe pure
private fnbool matchListTokens(RelaxNgPattern[] patterns, string[] tokens, out string message) @safe
private fnbool canMatchEmptyList(RelaxNgPattern p) @safe pure
private fnXmlElement[] elementChildren(XmlElement el) @safe
private fnbool hasElementChild(XmlElement el) @safe nothrow

Variables 1

private enumvarRELAXNG_NS = "http://relaxng.org/ns/structure/1.0"