Das schöne an RelaxNG ist die Tatsache, dass man damit Sachen machen kann, die mit anderen Schemasprachen nicht so leicht gehen. Z.b. kann man ein unvollständiges Schema erzeugen, das nur ganz bestimmte Teile der XML Instanz prüft.
Betrachten wir dazu das folgendes Beispiel: Konzepte Exklusion mit RelaxNG
unbehandeltesElement =
element * - (aussteller |
empfaenger |
datum) {
(attribute * { text } |
text |
unbehandelteElemente)*
}
start =
element abrechung {
element id { xsd:NMTOKEN },
element datum { xsd:date },
[...]
element zahlungen {
element zahlung {
element id { xsd:NMTOKEN },
element datum { xsd:date },
element plan { xsd:NMTOKEN },
[...]
},
element beleg-daten {
element beleg {
attribute nummer { xsd:integer }?,
element datum { xsd:date },
unbehandeltesElement+,
element aussteller { text },
unbehandeltesElement+,
element empfaenger { text },
unbehandeltesElement+
}
}
}+
}
}Plain TextVon den Elementen abrechnung und zahlung wissen wir, wie sie aufgebaut sind und können sie vollständig modellieren. Die unbekannte Größe ist allerdings das Element beleg . Dieses stammt von einer externen Quelle, und wir wissen nur, das darin zwingend die Felder datum , empfaenger und aussteller vorhanden sein müssen.
Zwischen diesen Elementen gibt es mindestens ein, aber auch mehrere unbekannte Elemente. Damit wir nun XML Instanzen, die nach diesem Schema aufgebaut sind, validieren können, wird ein Element unbehandeltesElement modelliert, das sozusagen einen Platzhalter darstellt. Dieses schliesst explizit die zwingenden Felder datum , empfaenger und aussteller aus, um deren Validierung durch das Schema nicht zu verfälschen.