2011-01-04 3 views
0

J'ai une restriction pour définir les valeurs de l'élément. Selon les règles que je veux définir, l'ensemble de valeurs suivant est possible pour mon élément.Limitation de valeurs dans un groupe d'éléments via XML Schema

<tags> 
    <tag>One of Audio, Video, Others.</tag> 
    <tag>For Audio, either Label or Record, For Video, either Studio or Producer, For Others this tag will be empty.</tag> 
    <tag>One of English, Spanish, French</tag> 
</tags> 

Maintenant, je aurais pu définir une restriction de modèle regex dans mon XSD pour un seul élément tags si elle était delimiter le texte brut (,) séparés des valeurs qui pourraient être

<element name="tags"> 
    <simpleType> 
     <restriction base="string"> 
      <pattern value="(Audio, (Label|Record)|Video, (Studio|Producer)|Others), (English|Spanish|French)" /> 
     </restriction> 
    </simpleType> 
</element> 

Mais depuis que j'ai séquence d'éléments avec le même nom tag, je ne suis pas sûr qu'il est même possible de restreindre un tel moyen via XSD. Je sais que je peux restreindre les valeurs via enumeration mais je ne peux pas les grouper. Je veux suivant XML pour valider

<tags> 
    <tag>Audio</tag> 
    <tag>Record</tag> 
    <tag>English</tag> 
</tags> 

Et suite à l'échec de validation

<tags> 
    <tag>Others</tag> 
    <tag>Record</tag> 
    <tag>English</tag> 
</tags> 

Mon cas réel est beaucoup plus complexe avec des restrictions imbriquées, mais je quelqu'un peut aider dans un état ci-dessus, je pense que je peux prenez-le comme référence et résolvez mon problème.

Répondre

1

Je ne pense pas que vous le pouvez. Si vous avez le contrôle du schéma, pourquoi désirez-vous que cet ensemble de règles spécifique soit validé? Si vous avez exactement besoin de cette validation stricte, vous pouvez en avoir besoin au niveau de l'application et non au niveau de la définition du document. Il semble que ce que vous voulez vraiment, c'est un moyen d'étiqueter des informations différentes en fonction de certains «types» d'étiquettes. Il n'y a vraiment aucune raison d'avoir une liste d'éléments tous les tags nommés, vous savez qu'ils sont déjà des balises du nom des éléments parents. Au lieu de cela, si vous voulez une validation basée sur le type de balises, vous devez utiliser différents types d'éléments et structurer votre schéma pour valider par rapport aux types autorisés quand et où. Pour vos données, cela peut être fait en utilisant des types complexes et un modèle de choix:

<xs:element name="audio"> 
    <xs:complexType> 
     <xs:choice> 
     <xs:element name="Label" type="xs:string"/> 
     <xs:element name="Record" type="xs:string"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="generic"> 
    <xs:choice> 
     <xs:element name="Studio" type="xs:string"/> 
     <xs:element name="Producer" type="xs:string"/> 
    </xs:choice> 
    </xs:complexType> 

    <xs:element name="video" type="generic"/> 
    <xs:element name="other" type="generic"/> 

    <xs:element name="tags"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:choice> 
      <xs:element ref="audio"/> 
      <xs:element ref="video"/> 
      <xs:element ref="other"/> 
     </xs:choice> 
     <xs:element name="language"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="English"/> 
       <xs:enumeration value="Spanish"/> 
       <xs:enumeration value="French"/> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

Je pris la liberté pour le producteur, label, Studio et enregistrement que vous voulez les valeurs de ces types ainsi. Sinon, pour votre cas d'origine, vous pouvez simplement utiliser un attribut sur les éléments parents plutôt comme ceci:

<xs:complexType name="generic"> 
    <xs:attribute name="meta-type"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="Studio"/> 
      <xs:enumeration value="Producer"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    </xs:complexType> 

Au lieu d'utiliser un groupe de choix que vous pouvez utiliser substitutionGroups mais cela nécessiterait chaque élément à tirer de la même tapez ce que vous ne voulez pas.

Ces schémas peuvent être développés assez facilement et si vous avez toujours besoin d'une liste générique de tag > qui n'a pas besoin de validation stricte, vous pouvez l'ajouter dans le cadre de la définition de séquence de tags.

Peut-être que quelqu'un peut vous donner une meilleure réponse à vos besoins d'origine, mais j'espère que cette information aide.

+0

Bonne réponse - le problème est la conception du langage et non l'implémentation du schéma. Si cela est vraiment nécessaire, schematron serait la seule solution possible. –

+0

C'était vraiment une bonne réponse et j'aurais pu faire la même chose, mais malheureusement, je ne peux pas changer la structure de à différents éléments. Je dois en quelque sorte valider les XML entrants du fournisseur via XSD seulement. Et seule la solution possible semble opter pour un élément de chaîne délimité restreint par un motif regex (celui que j'ai donné par exemple.) Si la séquence ne peut pas être restreinte de cette façon. –