Conditional Type Assignment

www.altova.com Dieses Kapitel drucken Vorherige Seite Eine Ebene nach oben Nächste Seite

Startseite >  Benutzerhandbuch und Referenz > Bearbeitungsansichten > Schema-Ansicht > Content Model-Ansicht >

Conditional Type Assignment

Ein Conditional Type Assignment ist ein XSD 1.1 Feature, mit Hilfe dessen der Typ eines Elements anhand des Inhalts des XML-Dokuments, genauer gesagt, anhand des Werts der Attribute des Elements oder anhand des Vorhandenseins oder Fehlens von Attributen ermittelt wird. Angenommen, das XML-Dokument hat das folgende Element:

 

<publication kind="magazine">

...

</publication>

 

Im Schema kann definiert werden, dass der Typ des Elements publication abhängig vom Wert des Attributwerts @kind des Instanzelements ein unterschiedlicher sein kann. Im Schema wird dies mit Hilfe des Elements alternative definiert, welches neu in XSD 1.1 ist. Es werden mehrere Typen definiert, von denen sich jeder in einem alternative Element befindet.

 

In der Abbildung unten ist das Element Publication mit drei alternative Child-Elementen  deklariert, von denen zwei ein test Attribut (@kind eq 'magazine' und @kind eq 'book') haben. Das dritte alternative Element hat kein test Attribut, sondern eine simpleType-Zuweisung xs:error (diese Zuweisung erfolgt in der Eingabehilfe "Details" und wird im Diagramm nicht angezeigt). Wenn dieser Typ ausgelöst wird, wird ein XML-Validierungsfehler zurückgegeben.

CTAAlternatives01

Unten sehen Sie das XML-Fragment für die obigen Deklarationen:

 

<xs:complexType name="PublicationType">

   <xs:sequence>

 <xs:element name="Title" type="xs:string"/>

 <xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>

 <xs:element name="Date" type="xs:gYear"/>

   </xs:sequence>

   <xs:attribute name="kind" type="xs:string"/>

</xs:complexType>

 

<xs:complexType name="MagazineType">

   <xs:complexContent>

 <xs:restriction base="PublicationType">

              <xs:sequence>

         <xs:element name="Title" type="xs:string"/>

         <xs:element name="Date" type="xs:gYear"/>

    </xs:sequence>

 </xs:restriction>

   </xs:complexContent>

</xs:complexType>

 

<xs:element name="Publication" type="PublicationType">

   <xs:alternative test="@kind eq 'magazine'" type="MagazineType"/>

   <xs:alternative test="@kind eq 'book'">

 <xs:complexType>

              <xs:complexContent>

         <xs:extension base="PublicationType">

               <xs:sequence>

                 <xs:element name="ISBN" type="xs:string"/>

                 <xs:element name="Publisher" type="xs:string"/>

            </xs:sequence>

         </xs:extension>

    </xs:complexContent>

 </xs:complexType>

   </xs:alternative>

   <xs:alternative type="xs:error"/>

</xs:element>

 

Beachten Sie die folgenden Punkte:

 

Aus den gleichrangigen alternative Elementen wird das erste alternative Element,  das auf true ausgewertet wird, ausgewählt. Daher ist es wichtig, welche Reihenfolge die  alternative Elemente haben. Sie können deren Reihenfolge in der Content Model-Ansicht durch Ziehen der alternative Elementkästchen an die gewünschte Stelle ändern.
Beachten Sie, dass das Publication Element einen Typ hat (PublicationType). Dieser Typ wird als Standardtyp verwendet, wenn keines der alternative Elemente verwendet wird. In unserem Beispiel oben wird jedoch das alternative Element vom Typ xs:error verwendet, wenn beide vorherigen alternative Elementbedingungen false zurückgeben.
Wenn keine alternative Elementbedingung erfüllt wird und das Element keinen Standardtyp hat, so wird dem Element der Typ anyType zugewiesen. In diesem Fall kann  das Element jeden wohlgeformten XML-Inhalt haben.
Das Element alternative und der simpleType xs:error sind neu in XSD 1.1.

 

Bearbeitung in der Content Model-Ansicht

Über das Kontextmenü des Elements (siehe Content Model in der Abbildung oben) können Sie einen alternative-Typ als Child zu einer Elementdeklaration hinzufügen.

 

Der Typ des alternative Elements wird in der Eingabehilfe "Details" definiert. Wenn der Typ ein complexType ist, wird er im erweiterten Rechteck des alternative Elements angezeigt und kann dort weiter bearbeitet werden (siehe Abbildung unten). SimpleTypes werden im Diagramm nicht angezeigt, können aber auf dem Register "Simple Type) der Eingabehilfe "Details" definiert werden.

CTABoxExpandedCTADetailsEH

Anmerkung:Über das Attribut xpathDefaultNamespace können Sie in der Eingabehilfe "Details" einen Namespace für den XPath-Ausdruck definieren. Nähere Informationen zu XPath-Standard-Namespaces finden Sie im Abschnitt unten.

 

Verwendung von xpathDefaultNamespace

Ein im XML-Schema-Dokument deklarierter Standard-Namespace ist der Standard-Namespace des  XML-Schema-Dokuments. Er gilt für Elementnamen ohne Präfix im Schema-Dokument, nicht aber für Elementnamen ohne Präfix in XPath-Ausdrücken im Schema-Dokument.

 

Mit dem Attribut xpathDefaultNamespace (einem XSD 1.1-Feature) wird der Namespace definiert, dem Elementnamen ohne Präfix im XPath-Ausdruck angehören.

 

Der Geltungsbereich von XPath-Standard-Namespaces erstreckt sich auf die XML-Schema-Elemente, für die diese Namespaces deklariert wurden. Das Attribut xpathDefaultNamespace kann in den folgenden XML Schema 1.1-Elementen vorkommen:

 

xs:schema
xs:assert and xs:assertion
xs:alternative
xs:selector and xs:field (in Identity Constraints)

 

Das xpathDefaultNamespace Attribut für xs:schema wird im Dialogfeld "Schema-Einstellungen" (Schema-Design | Schema-Einstellungen) im XSD 1.1-Modus definiert. Für die anderen oben aufgelisteten Elemente wird es in der jeweiligen Details-Eingabehilfe (Beispiel in der Abbildung unten) definiert.

AssertEHDetails02XPDNS

Durch Deklarieren des XPath-Standard-Namespace für xs:schema wird der XPath-Standard-Namespace für den Geltungsbereich des gesamten Schemas deklariert. Sie können diese Deklaration für Elemente, in denen das Attribut xpathDefaultNamespace zulässig ist (siehe Liste oben), außer Kraft setzen.

 

Anstelle eines tatsächlichen Namespace kann das Attribut xpathDefaultNamespace eines von drei Schlüsselwörtern enthalten:

 

##targetNamespace: Der XPath-Standard-Namespace ist mit dem Target Namespace des Schemas identisch.
##defaultNamespace: Der XPath-Standard-Namespace ist mit dem Standard-Namespace des Schemas identisch.
##local: Es gibt keinen XPath-Standard-Namespace.

 

Wenn im Dokument kein XPath-Standard-Namespace deklariert ist, haben Elemente ohne Präfix in XPath-Ausdrücken keinen Namespace.

 

Anmerkung:Die XPath-Standard-Namespace-Deklaration gilt nicht für Attribute.

 

 


© 2019 Altova GmbH