2009-08-04 6 views
1

Je suis à la recherche de la meilleure solution de mon schéma XML (XSD).Comment réaliser une réponse dérivée (XSD)?

J'ai un response:

<xs:element name="exampleCatalogResponse"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="meta" type="tns:metaType" /> 
      <xs:element name="data" type="tns:defaultDataType" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

... le defaultDatatype:

<xs:complexType name="defaultDataType"> 
    <xs:sequence> 
     <xs:element name="catalog"> 
      <xs:complexType> 
       <xs:sequence maxOccurs="unbounded"> 
        <xs:element name="catalogItem" type="tns:catalogItem" /> 
       </xs:sequence> 
      </xs:complexType> 
      <xs:unique name="itemIdConstraint"> 
       <xs:selector xpath="tns:catalogItem" /> 
       <xs:field xpath="tns:id" /> 
      </xs:unique> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

... et le catalogItem:

<xs:complexType name="catalogItem"> 
    <xs:sequence> 
     <xs:element name="id" type="xs:nonNegativeInteger" /> 
    </xs:sequence> 
</xs:complexType> 

... mais maintenant il y a un article spécial qui se spécialise catalogItem:

<xs:complexType name="specialItem"> 
    <xs:complexContent> 
     <xs:extension base="tns:catalogItem"> 
      <xs:sequence> 
       <xs:element name="code" type="xs:string" /> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

Maintenant je besoin d'un Response spécialisé pour mon specialItem pour répondre à la demande qui s'attend à specialItem.

Comment est-ce que je peux réaliser ceci, sans écrire un autre defaultDataType où seulement le type de catalogItem change en tns:specialItem?

+0

Il n'est pas strictement nécessaire de mettre en retrait huit fois. –

+0

Vous avez certainement raison, je l'ai réparé – codevour

Répondre

0

Merci pour votre 13ren astuce, conseil,

J'utilisé la fonction de subsomption. Donc le catalogue par défaut est partout utilisé aussi pour l'expression unique. Et maintenant, si je l'utilise en XML, je peux le spécifier par type. Par conséquent, le dernier élément est la valeur par défaut, et les deux éléments ci-dessus sont des éléments spécialisés.Cela fonctionne très bien pour moi.

1

Je ne pense pas que vous puissiez imposer des contraintes de cooccurrence comme celle de XSD. Dans l'esprit d'une solution de puzzle, voici une façon maladroite de faire des copies avec le changement que vous voulez, sans manuellement « écrire un autre DefaultDataType »:

  1. définissent les complexTypes ci-dessus dans un document de schéma sans espace de noms.

  2. <include> dans un deuxième document de schéma, qui possède un espace de noms - cela lui donne cet espace de noms. Nous pouvons le faire dans de nombreux documents de schéma, en obtenant chaque fois une copie dans cet espace de noms distinct.

  3. Dans chacun de ces documents de schéma, étendez catalogItem, afin que chaque extension soit dans son propre espace de noms. Dans un document de schéma final, incluez tout ce qui précède et faites en sorte qu'ils soient substituables, afin qu'ils puissent tous être utilisés en tant que réponse. (sinon, vous pourriez les faire tous étendre un autre élément Response dans encore-another-schema). REMARQUE: Vous aurez besoin d'une manière différente pour appliquer la contrainte itemIdConstraint, qui va au-delà des espaces de noms. Désinvolte, je ne sais pas si c'est possible.

Cela fonctionne en faisant une copie distincte de DefaultDataType pour chacun d'eux, et ainsi ne fonctionnera pas si vous voulez réellement qu'ils utilisent tous le même DefaultDataType. Comme je l'ai dit, c'est bizarre, mais c'est la seule façon de voir ce que je veux faire. Je l'offre comme une solution de puzzle, plutôt que pratique!