Druck-Version
Deutsch Nederlands English
Inhaltsverzeichnis
Teile: Teil: XML Teil: PHP Quellenverzeichnis
Pfad: > Teil: XML > XML-Schema
Benachbarte Abschnitte: Grundlagen Definition komplexer Typen, Elementen- und Attributdeklaration Simple Typen Anonyme Typ-Definitionen Element-Inhalte Kommentare (annotations) Aufbau von Inhaltsmodellen Attribut-Gruppen NIL-Werte
1.3.7. Aufbau von Inhaltsmodellen

Die Definitionen komplexer Typen im purchaseOrder-Schema deklarieren jeweils eine Sequenz von Elementen, die in einem Instanzdokument erscheinen müssen. Das Auftreten kann als optional deklariert werden durch die Verwendung von minOccurs mit einer 0, aber auch anderweitig mittels minOccurs und maxOccurs gesteuert werden. XML-Schema stellt Werkzeuge bereit, die es ermöglichen, das Auftreten von Elementgruppen zu steuern. Diese können allerdings nicht auf Attribute angewendet werden.

XML-Schema ermöglicht das Definieren und Benennen von Elementgruppen, so dass die Elemente für den Aufbau von Inhaltsmodellen komplexer Typen verwendet werden können. Unbenannte Gruppen können ebenso definiert und zusammen mit den benannten Gruppen verwendet werden, und die Reihenfolge des Auftretens kann auf die Reihenfolge der Deklaration begrenzt werden. Alternativ kann das Auftreten der Elemente derart eingeschränkt werden, das lediglich eines der Elemente im Instanzdokument erscheinen darf.

Zur Verdeutlichung werden im PurchaseOrderType zwei Gruppen eingefügt, so dass purchaseOrder-Elemente anschliessend entweder getrennte Elemente für shipTo- und billTo-Adressen enthalten dürfen, oder, falls beide Orte die gleichen sein sollten, eine einzelne Adresse angegeben werden kann.

Beispiel 38: Nested-Choise- und Sequenz-Gruppen
<xsd:complexType name="PurchaseOrderType"> 
	<xsd:sequence> 
		<xsd:choice> 
			<xsd:group ref="shipAndBill"/> 
			<xsd:element name="singleUSAddress" type="USAddress"/> 
		</xsd:choice> 
		<xsd:element ref="comment" minOccurs="0"/> 
		<xsd:element name="items" type="Items"/> 
	</xsd:sequence> 
	<xsd:attribute name="orderDate" type="xsd:date"/> 
</xsd:complexType> 
<xsd:group name="shipAndBill"> 
	<xsd:sequence> 
		<xsd:element name="shipTo" type="USAddress"/> 
		<xsd:element name="billTo" type="USAddress"/> 
	</xsd:sequence> 
</xsd:group>  

Die choise-Gruppe erlaubt das Auftreten eines der Kindelementen im Instanzdokument. Eines seiner Kindelementen ist ein group-Element, welches die benannte Gruppe shipAndBill referenziert, das seinerseits aus den Elementen shipTo und billTo besteht. Das zweite Kind ist das Element singleUSAddress.

Demnach muss ein purchaseOrder-Element im Instanzdokument entweder ein shipTo-Element gefolgt von einem billTo-Element als Kinder besitzen, oder aber ein einzelnes singleUSAddress-Element. Nach der choise-Gruppe werden die Elemente comment und items deklariert, und diese - zusammen mit der choise-Gruppe - sind in einem sequence-Element geschachtelt. Heraus folgt, das nach dem Adress-Element, bzw. den Adress-Elementen, jeweils ein comment- und ein items-Element folgen müssen, und zwar in dieser Reihenfolge.

Neben dieser Methode gibt es noch eine weitere, die das Erscheinen von Elementen in einer Gruppe steuert. Die all-Gruppe ermöglicht es, das die Elementen jeweils optional einmalig in beliebiger Reihenfolge auftreten dürfen. Das all-Element darf nur als Top-Level-Element eines Content-Modells verwendet werden und die Kindelemente ihrerseits dürfen keine Gruppen sein und auch nur einmalig vertreten sein. Mit anderen Worten: Die erlaubten Werte der minOccurs- und maxOccurs-Attribute der Kinder lauten 0 und 1.

Folgendes Beispiel zeigt die Definition von purchaseOrder, so dass die Kinder in beliebiger Reihenfolge auftreten dürfen.

Beispiel 39: Verwendung einer all-Gruppe
<xsd:complexType name="PurchaseOrderType"> 
	<xsd:all> 
		<xsd:element name="shipTo" type="USAddress"/> 
		<xsd:element name="billTo" type="USAddress"/> 
		<xsd:element ref="comment" minOccurs="0"/> 
		<xsd:element name="items" type="Items"/> 
	</xsd:all> 
	<xsd:attribute name="orderDate" type="xsd:date"/> 
</xsd:complexType>  

Das comment-Element im Beispiel kann demnach optional im Instanzdokument erscheinen, und seine Position könnte vor oder hinter shipTo, billTo und items sein. Das gleiche gilt für die anderen Elemente ebenso.

Nicht erlaubt ist jedoch die Deklaration weiterer Elemente außerhalb der all-Gruppe, um so bspw. ein weiteres comment-Element zu ermöglichen. Das all-Element muss alleiniges Top-Level-Element sein. Folgendes ist also illegal.

Beispiel 40: Illegale Verwendung einer all-Gruppe
<xsd:complexType name="PurchaseOrderType"> 
	<xsd:sequence> 
		<xsd:all> 
			<xsd:element name="shipTo" type="USAddress"/> 
			<xsd:element name="billTo" type="USAddress"/> 
			<xsd:element name="items" type="Items"/> 
		</xsd:all> 
		<xsd:sequence> 
			<xsd:element ref="comment" minOccurs="0" 
									maxOccurs="unbounded"/> 
		</xsd:sequence> 
	</xsd:sequence> 
	<xsd:attribute name="orderDate" type="xsd:date"/> 
</xsd:complexType>  

Schlußendlich ist die Verwendung von minOccurs- und maxOccurs-Attributen im Inhaltsmodell (dargestellt mit den Elementen group, choise und all) erlaubt. Durch Kombination und Verschachtelung dieser Elemente und die Auszeichnung mittels dieser Attribute können alle Inhaltsmodelle, die mittels XML 1.0 DTD ausgedrückt werden konnten, umgesetzt werden. Die all-Gruppe erlaubt darüber hinaus noch weitere Möglichkeiten.