用于表达问题描述的(紧凑语法)RelaxNG 语法可以写成:
start = element body { h1?, h2?, p.paragraph1?, p.paragraph2?, p.paragraph3? }
h1 = element h1 { text & attribute class { string } }
h2 = element h2 { text & attribute class { string } }
p.paragraph1 = element p { text & attribute class { string "paragraph1" } }
p.paragraph2 = element p { text & attribute class { string "paragraph2" } }
p.paragraph3 = element p { text & attribute class { string "paragraph3" } }
以 RelaxNG XML 语法表示:
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="">
<start>
<element name="body">
<optional>
<ref name="h1"/>
</optional>
<optional>
<ref name="h2"/>
</optional>
<optional>
<ref name="p.paragraph1"/>
</optional>
<optional>
<ref name="p.paragraph2"/>
</optional>
<optional>
<ref name="p.paragraph3"/>
</optional>
</element>
</start>
<define name="h1">
<element name="h1">
<interleave>
<text/>
<attribute name="class">
<data type="string"/>
</attribute>
</interleave>
</element>
</define>
<define name="h2">
<element name="h2">
<interleave>
<text/>
<attribute name="class">
<data type="string"/>
</attribute>
</interleave>
</element>
</define>
<define name="p.paragraph1">
<element name="p">
<interleave>
<text/>
<attribute name="class">
<value type="string">paragraph1</value>
</attribute>
</interleave>
</element>
</define>
<define name="p.paragraph2">
<element name="p">
<interleave>
<text/>
<attribute name="class">
<value type="string">paragraph2</value>
</attribute>
</interleave>
</element>
</define>
<define name="p.paragraph3">
<element name="p">
<interleave>
<text/>
<attribute name="class">
<value type="string">paragraph3</value>
</attribute>
</interleave>
</element>
</define>
</grammar>