Skip to content

Latest commit

 

History

History
123 lines (105 loc) · 3.3 KB

namedpattern.adoc

File metadata and controls

123 lines (105 loc) · 3.3 KB

Benannte Muster

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.