Für alle größeren Schemadateien ist es vorteilhaft, wenn man das Schema in einzelne Teile gliedert. Mit define
kann man einen einzelnen Abschnitt definieren und einen Namen zuweisen, auf dem man später mit ref
verweisen kann.
Eine solche Definition sieht so aus:
define
<define name="cardContent">
<element name="name">
<text/>
</element>
<element name="email">
<text/>
</element>
</define>
da nun aber bei mehreren solchen Definitionen unklar ist, wo das Schema »anfängt«, muss eine andere Struktur her. Das Grundgerüst ist nun folgendes:
grammar
start
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="wurzelelement">
...
</element>
</start>
</grammar>
Jetzt kann das bekannte Schema in Teile zerlegt werden:
ref
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="addressBook">
<zeroOrMore>
<element name="card">
<ref name="cardContent"/>
</element>
</zeroOrMore>
</element>
</start>
<define name="cardContent">
<element name="name"><text /></element>
<element name="email"><text /></element>
</define>
</grammar>
Man kann das auch noch weiter treiben, in dem man die beiden Elemente aus card
auch noch aufteilt:
<!-- der Rahmen wie oben -->
<define name="cardContent">
<ref name="namecontent"/>
<ref name="emailcontent"/>
</define>
<define name="namecontent">
<element name="name">
<text />
</element>
</define>
<define name="emailcontent">
<element name="email">
<text />
</element>
</define>
Die Reihenfolge der Definitionen ist beliebig. Die Referenzen dürfen sich auch selbst aufrufen:
<define name="inline">
<choice>
<text/>
<element name="bold">
<ref name="inline"/>
</element>
<element name="italic">
<ref name="inline"/>
</element>
<element name="span">
<optional>
<attribute name="style"/>
</optional>
<ref name="inline"/>
</element>
</choice>
</define>
Die Elemente bold
, italic
und span
dürfen entweder Text enthalten oder eines der Elemente bold
, italic
oder span
, und das mit beliebiger Schachtelungstiefe.