Bonjour,

J'aimerais dans mon schema xml laisser le choix entre un élément non répété ou un élément répété, portant le même nom mais devant posséder un attribut. J'écris donc ceci :

<xs:choice>
	<xs:element name="OldPrice" maxOccurs="unbounded">
		<xs:complexType>
			<xs:simpleContent>
				<xs:extension base="xs:string">
					<xs:attribute name="product" use="required"/>
				</xs:extension>
			</xs:simpleContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="OldPrice"/>
</xs:choice>


Le problème est que ce code n'est pas valide parce que les 2 éléments du choix ont le même nom. Savez-vous pourquoi xml schema impose celà ? Est-il possible de contourner le problème ?

mathmax
Modifié par mathmax (14 Dec 2006 - 23:15)
Salut
Il me semble que c'est faisable avec un type abstrait et des types dérivés. Par contre, tu es obligé d'ajouter le type dans les données via xsi:type :

<xs:complexType name="TypeAbstrait" abstract="true"/>

<xs:complexType name="Type1" mixed="true">
	<xs:complexContent mixed="true">
		<xs:extension base="TypeAbstrait">
			<xs:sequence>
				<xs:element name="OldPrice" maxOccurs="unbounded">
					<xs:complexType>
						<xs:simpleContent>
							<xs:extension base="xs:string">
								<xs:attribute name="product" use="required"/>
							</xs:extension>
						</xs:simpleContent>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:extension>
	</xs:complexContent>
</xs:complexType>

<xs:complexType name="Type2" mixed="true">
	<xs:complexContent mixed="true">
		<xs:extension base="TypeAbstrait">
			<xs:element name="OldPrice"/>
		</xs:extension>
	</xs:complexContent>
</xs:complexType>



<OldPrice product="machin" xsi:type="Type1"/>
<OldPrice xsi:type="Type2"/>


Par contre je n'ai jamais eu l'occasion de tester ce genre de choses, alors c'est sans garantie Smiley sweatdrop
a+
Je ne comprends pas où tu laisse le choix entre les 2 éléments. Tu n'utilise pas la balise choice ?
J'avoue ne pas avoir réfléchis longuement sur ta question, mea culpa, mais peut-être pourras-tu t'en sortir avec une union de type. Si tu fais un type de OldPrice qui se repete, et l'autre qui est fixe, et que tu fais l'union comme suit, peut-être que cela marchera.

Ex :

Deriving Simple Types: Unions
Deriving Simple Types: ListsContentsComplex Types

Provides a choice of simple types (including lists).

E.g: for post code, you might have a UK postcode, or a US zip code:



<xsd:simpleType name="postcode">
<xsd:union memberType="UKPostcode USZipcode"/>
</xsd:simpleType>
<xsd:element name="Postcode" type="postcode"/>



based on predefined derived types. Then:


<Postcode>OX11 0QX</Postcode>
<Postcode>PA95630</Postcode>

Modifié par Reen (16 Jan 2007 - 12:50)