Salut a tous,
je suis debutant en XML SCHEMA et je voulais savoir si on peux faire dans XS de la programmation conditionnelle.
Voici un exemple pour mieux comprendre ce que je veux faire :

J'ai le xml suivant :

<predicate-n-ary-operator operator-type="AND">
	<predicate-has-element element-type="SSR">
		<matching-predicate>
			<predicate-property-is property-name="CODE">
				<value>VGML</value>
			</predicate-property-is>
		</matching-predicate>
	</predicate-has-element>
	<predicate-has-element activity="added" element-type="AIR"/>
	<predicate-has-element activity="*" element-type="REMARK">
		<matching-predicate>
			<predicate-property-is property-name="TYPE">
				<value>RM</value>
			</predicate-property-is>
		</matching-predicate>
	</predicate-has-element>
</predicate-n-ary-operator>


et je voudrais par exemple pouvoir dire dans le schema si l'attribut element_type de l'element predicate-has-element est egal a SSR alors l'attribut property-name de l'element predicate-property-is est obligatoirement egal a CODE


Voila le schema que j'ai deja fait mais il ne comporte pas les conditions :


<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified">

  <xsd:element name="predicate-n-ary-operator">
    <xsd:complexType>
      <xsd:choice minOccurs="2" maxOccurs="unbounded">
        <xsd:element ref="predicate-has-element"/>
      </xsd:choice>
      <xsd:attribute name="operator-type" use="required">
      	<xsd:simpleType>
        	<xsd:restriction base="xsd:string">
          	     	<xsd:enumeration value="AND"/>
        	</xsd:restriction>
      	</xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="predicate-has-element">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="1">
        <xsd:element ref="matching-predicate"/>
      </xsd:choice>
      <xsd:attribute name="element-type" use="required">
      	<xsd:simpleType>
        	<xsd:restriction base="xsd:string">
          	     	<xsd:enumeration value="AIR"/>
          	     	<xsd:enumeration value="REMARK"/>
          	     	<xsd:enumeration value="SSR"/>
        	</xsd:restriction>
      	</xsd:simpleType>
      </xsd:attribute>      
      <xsd:attribute name="activity">
      	<xsd:simpleType>
        	<xsd:restriction base="xsd:string">
          	     	<xsd:enumeration value="*"/>
          	     	<xsd:enumeration value="added"/>
        	</xsd:restriction>
      	</xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="matching-predicate">
    <xsd:complexType>
      <xsd:choice minOccurs="1" maxOccurs="1">
        <xsd:element ref="predicate-property-is"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="predicate-property-is">
    <xsd:complexType>
      <xsd:choice minOccurs="1" maxOccurs="1">
        <xsd:element ref="value"/>
      </xsd:choice>
      <xsd:attribute name="property-name" use="required">
      	<xsd:simpleType>
        	<xsd:restriction base="xsd:string">
          	     	<xsd:enumeration value="CODE"/>
          	     	<xsd:enumeration value="TYPE"/>
        	</xsd:restriction>
      	</xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="value" type="xsd:string"/>

</xsd:schema>


Merci d'avance pour votre aide.
Modifié par Mehdi146 (03 Aug 2006 - 15:20)
Slt,

je ne crois pas que XML Schéma supporte les conditions. Dans ce cas, tu ne peux que énumérer les différentes possibilités dans un <xs:choice/>, ce qui peut devenir lourd s'il y en a beaucoup, ou alors faire cette vérification via du scripting, et non par XML Schéma.

Peut être que RelaxNG ou Schematron supportent les conditions, mais c'est ça de plus à apprendre alors...

a+
SirWam a écrit :
Slt,

je ne crois pas que XML Schéma supporte les conditions. Dans ce cas, tu ne peux que énumérer les différentes possibilités dans un <xs:choice/>, ce qui peut devenir lourd s'il y en a beaucoup, ou alors faire cette vérification via du scripting, et non par XML Schéma.

Peut être que RelaxNG ou Schematron supportent les conditions, mais c'est ça de plus à apprendre alors...

a+


Salut,

Merci pour ta reponse.
je me disais bien qu'on ne pouvait pas mettre de conditions dans xml schema cependant je veux bien que tu m'expliques comment on peut faire pour énumérer les différentes possibilités dans un <xs:choice/> meme si ca devient lourd apres. au fait il se trouve que j'ai deja essaye de le faire et je n'ai pas reussi car on fait un choice sur des elements qui ont le meme nom.

Merci
Modifié par Mehdi146 (04 Aug 2006 - 10:23)
Slt,

c'est un truc du genre :

<xsd:choice>
<xsd:complexType>
<!-- description de la 1ère possibilité -->
</xsd:complexType>
<xsd:complexType>
<!-- de la seconde -->
</xsd:complexType>
<!-- et ainsi de suite -->
</xsd:choice> 


++
SirWam a écrit :
Slt,

c'est un truc du genre :

<xsd:choice>
<xsd:complexType>
<!-- description de la 1ère possibilité -->
</xsd:complexType>
<xsd:complexType>
<!-- de la seconde -->
</xsd:complexType>
<!-- et ainsi de suite -->
</xsd:choice> 


++


au fait ce truc ne marche pas car on fait un choice sur des elements qui ont le meme nom.

ce truc par exemple ne marche.

<xsd:choice>

<xsd:complexType>
<xsd:element name="predicate-property-is">
    <xsd:complexType>
      <xsd:choice minOccurs="1" maxOccurs="1">
        <xsd:element ref="value"/>
      </xsd:choice>
      <xsd:attribute name="property-name" use="required">
      	<xsd:simpleType>
        	<xsd:restriction base="xsd:string">
          	     	<xsd:enumeration value="TYPE"/>
        	</xsd:restriction>
      	</xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:complexType>

<xsd:complexType>
    <xsd:element name="predicate-property-is">
    <xsd:complexType>
      <xsd:choice minOccurs="1" maxOccurs="1">
        <xsd:element ref="value"/>
      </xsd:choice>
      <xsd:attribute name="property-name" use="required">
      	<xsd:simpleType>
        	<xsd:restriction base="xsd:string">
          	     	<xsd:enumeration value="CODE"/>
        	</xsd:restriction>
      	</xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:complexType>

</xsd:choice> 
Re,

dans ce cas, je pense que tu dois faire le choice dans l'élément :

<xsd:complexType>

<xsd:element name="predicate-property-is">

    <xsd:complexType>

      <xsd:choice><!-- modèle de contenu 1 --></xsd:choice>
      <xsd:choice><!-- modèle de contenu 2 --></xsd:choice>
      <xsd:choice><!-- modèle de contenu 3 --></xsd:choice>
<!-- etc -->

    </xsd:complexType>

  </xsd:element>

</xsd:complexType>


Après je ne connais pas trop XML schéma donc je dis peut être n'importe quoi, même si c'est la solution qui me semble la plus logique.

++