RELAX NG (or RNG) is a schema language for XML.
Schema languages let you check whether an XML document conforms to a given schema: that it follows a certain structure of elements and attributes.
RELAX NG:
DTDs date back to SGML, and are also in XML 1.0.
<!ELEMENT title (#PCDATA)>
<!ATTLIST title
id ID #IMPLIED
class CDATA #IMPLIED
title CDATA #IMPLIED
%i18n;>
Opinion in the XML community seems to be running against them:
So long, and thanks for all the fish...
Variously called XML Schema or XSD.
(http://www.w3.org/XML/Schema)
<xs:schema xs="http://.../2001/XMLSchema>
<xs:element name="title">
<xs:complexType>
<xs attribute name="id" type="xs:ID"
use="required"/>
<xs attribute name="class" type="xs:string"/>
<xs attribute name="title" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
Drawbacks:
<? xml version="1.0"?>
<element name="title" xmlns="http://relaxng.org/...">
<attribute name="id"><text/></attribute>
<attribute name="class">
<choice>
<value>big</value><value>small</value>
</choice>
</attribute>
<attribute name="timestamp">
<data type="dateTime"
datatypeLibrary="http://.../XMLSchema-datatypes"/>
</attribute>
</element>
The algorithm for RELAX NG is remarkably elegant, and is based on computing the derivative of a pattern.
A pattern P is nullable if the empty string (or empty tree) matches it.
The derivative of a pattern P w.r.t tree X =
a pattern matching what's left of P after matching X.
| Pattern | Text | Derivative |
|---|---|---|
| a+b+ | a | a*b+ |
| a*b+ | aaa | a*b+ |
| a*b | b | Empty pattern |
The code is in the pyxml.sourceforge.net
CVS
under sandbox/relaxng.
These slides:
http://www.amk.ca/talks