2009-10-30 2 views
4

J'ai un extrait de code XML (fichier xsd) dans lequel je veux que les éléments NAME et ADRESS apparaissent dans n'importe quel ordre, mais toujours avant la séquence FILM.Comment obtenir une contrainte d'ordre d'éléments dans le schéma XML?

J'ai essayé de faire comme ceci:

<xs:element name="ROOM"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element ref="NAME"/> 
     <xs:element ref="ADRESS"/> 
     </xs:all> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="FILM"/> 
     </xs:sequence> 
     <xs:attribute name="group" type="xs:NCName"/> 
     <xs:attribute name="typ" use="required" type="xs:NCName"/> 
    </xs:complexType> 
    </xs:element> 

Je sais que la balise <xs:all> ne peut pas faire partie d'un élément avec d'autres éléments au même niveau de l'enfant ... mais ne peut pas trouver un moyen de sortir ...

Des suggestions? Merci d'avance !

Répondre

1

Ok, regarde comme je l'ai trouvé un moyen terme:

<xs:element name="ROOM"> 
    <xs:complexType> 

     <xs:choice> 
     <xs:sequence> 
      <xs:element ref="NAME"/> 
      <xs:element ref="ADRESS"/> 
      <xs:element maxOccurs="unbounded" ref="FILM"/> 
     </xs:sequence> 
     <xs:sequence> 
      <xs:element ref="ADRESS"/> 
      <xs:element ref="NAME"/> 
      <xs:element maxOccurs="unbounded" ref="FILM"/> 
     </xs:sequence> 
     </xs:choice> 

     <xs:attribute name="group" type="xs:NCName"/> 
     <xs:attribute name="typ" use="required" type="xs:NCName"/> 
    </xs:complexType> 
    </xs:element> 

Mais je suppose que ce n'est pas très optimisé, étant donné que si vous voulez faire avec 10 éléments, vous devez spécifier toutes les permutations ...

+0

Correct. Ce modèle de contenu peut être rendu plus court en factorisant l'élément 'FILM', de sorte que vous avez une séquence externe composée d'un choix suivi de la référence' FILM'. –

3

Ceci est une restriction du schéma XSD. Je vais citer: http://www.w3.org/TR/2001/REC-xmlschema-0-20010502/ puis commentaire:


Il existe une troisième option pour les éléments contraignants dans un groupe: Tous les éléments du groupe peuvent apparaître une fois ou pas du tout, et ils peuvent apparaître dans un ordre quelconque . Le groupe Tous (qui fournit une version simplifiée du connecteur SGML &) est limité au niveau supérieur de tout modèle de contenu. De plus, les enfants du groupe doivent tous être des éléments individuels (aucun groupe) et aucun élément du modèle de contenu ne peut apparaître plus d'une fois, c.-à-d. Que les valeurs autorisées de minOccurs et maxOccurs sont 0 et 1. Par exemple, purchaseOrder à apparaître dans un ordre quelconque, on pourrait redéfinir PurchaseOrderType comme: un « All » Groupe

<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> 

Par cette définition, un élément de commentaire peut apparaître en option dans les purchaseOrder, et il peut apparaître avant ou après tout shipTo, billTo et éléments éléments, mais il ne peut apparaître qu'une seule fois. De plus, les stipulations d'un groupe tous ne nous permettent pas de déclarer un élément tel qu'un commentaire en dehors du groupe comme un moyen de le faire apparaître plus d'une fois. Le schéma XML stipule qu'un groupe doit apparaître en tant que seul enfant en haut d'un modèle de contenu. En d'autres termes, ce qui suit est illégale: Exemple illégal avec un « All » Groupe

<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> 

je me souviens des discussions étaient à l'époque que xsd:all allait être trop compliqué pour modéliser si elle était moins restreint que cela. Il s'étend bientôt aux modèles d'analyse non déterministes. Donc, la restriction était de 0 ou 1 et pour aucun frère et soeur.

SGML avait un modèle plus puissant utilisant le connecteur & mais tous les systèmes ne l'ont pas implémenté.

EDIT Si vous souhaitez valider votre XML à ce niveau, vous pouvez utiliser Schematron comme second validateur après le schéma. Il est basé sur XSLT et ce type de contrainte est plus facile à exprimer.

+0

Merci beaucoup pour l'explication complète.Très instructif! En effet, j'avais lu cette section de référence de documentation XSD Schema. Pour l'instant, je traite de la solution que j'ai affichée ici. Je marque certainement votre réponse comme utile :) – Clem

Questions connexes