Ja, auf jeden Fall können Sie, mit xsi: type (was ist wahrscheinlich nicht das, was Sie wollen!). ZB mit dem xsd unten;
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xs:element name="data">
<xs:complexType>
<xs:choice>
<xs:element ref="elemParent" minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="elemParent" type="ctBase"></xs:element>
<xs:complexType name="ctNoAttChildReq">
<xs:complexContent>
<xs:extension base="ctBase">
<xs:sequence>
<xs:element name="elemKid" type="xs:string"></xs:element>
<xs:element name="elemKidAdditional" type="xs:string" minOccurs="0"></xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ctAttNoChild">
<xs:complexContent>
<xs:extension base="ctBase">
<xs:attribute name="attReq" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ctBase" abstract="true">
<xs:sequence/>
</xs:complexType>
Sie eine Instanz erhalten, die entweder ein Attribut oder ein oder mehrere Kinder hat, aber Sie haben xsi haben: Typ in der Instanz, die kein Show-Stopper sind oder nicht.
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/Xsds/StackOverflow_2070316_WIP.xsd">
<elemParent attReq="Yo!" xsi:type="ctAttNoChild"/>
<elemParent xsi:type="ctNoAttChildReq">
<elemKid>Adam</elemKid>
</elemParent>
<elemParent xsi:type="ctNoAttChildReq">
<elemKid>Eve</elemKid>
<elemKidAdditional>Sid</elemKidAdditional>
</elemParent>
Antworten dieser Art sind für mich nicht zufriedenstellend. Was ist der Grund für deine Aussage? –
XML-Schematypen sind Ihren OO-Programmiertypen sehr ähnlich. Sie können einen komplexen Typ erstellen, und Sie können die Reihenfolge der Elementtypen von Elementen und Attributen und die Einschränkungen, welche Arten von Werten zugewiesen werden können, einschränken. Das ist alles, was xsd für Sie tun kann. Was Sie wollen, ist eine Einschränkung, die mehr als ein Element/Attribut umfasst, was mit xsd einfach nicht möglich ist. Sie müssen Ihren eigenen Code schreiben, um dies zu bestätigen. – affan
Ich denke auch, dass es nicht möglich ist, und dieses Sprichwort ist eine ziemlich gute Antwort (wenn es richtig ist) :-) –