2010-09-26 7 views
0

J'ai un scénario dans lequel il faut restreindre quelques éléments de l'élément complextype quand il est référé. Par exemple ci-dessous l'élément AD lorsqu'il est référencé dans ADConfig, je veux seulement les éléments domainName, userName, mot de passe à référencer pas hostName, portNumber.comment restreindre des éléments de type complexe lorsque l'élément est référencé

<element name="AD"> 
     <complexType> 
      <sequence> 
       <element name="hostName" type="string"/> 
       <element name="portNumber" type="string"/> 
       <element name="domainName" type="string"/> 
       <element name="userName" type="string"/> 
       <element name="password" type="string"/> 
      </sequence> 
     </complexType> 
    </element> 

    <element name="ADConfig"> 
    <complexType> 
     <sequence> 
      <element ref="tns:AD"/> 
     </sequence> 
    </complexType> 
</element> 

Répondre

0

En termes d'exemple les documents que je pense que vous dites que vous voulez AD éléments qui sont des enfants ADConfig éléments sont constitués uniquement d'une séquence de domainName, userName et passsword. Ailleurs, dans ce document d'instance, vous pourriez avoir un élément AD qui avait les cinq enfants énumérés ci-dessus.

En supposant que j'ai ce correct, j'ai peur que votre exigence exacte ne soit simplement pas possible dans la version actuelle de XSD. Je crois que XML Schema 1.1 peut résoudre votre problème. Cependant, s'il est possible de réécrire légèrement votre schéma, cela devient possible. En créant deux types complexes, vous pouvez avoir deux modèles pour les éléments ayant le même nom (dans des contextes différents). Par exemple,

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified"> 


    <xs:complexType name="ADType1"> 
     <xs:sequence> 
      <xs:element name="hostName" type="xs:string"/> 
      <xs:element name="portNumber" type="xs:string"/> 
      <xs:element name="domainName" type="xs:string"/> 
      <xs:element name="userName" type="xs:string"/> 
      <xs:element name="password" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="ADType2"> 
     <xs:sequence> 
      <xs:element name="domainName" type="xs:string"/> 
      <xs:element name="userName" type="xs:string"/> 
      <xs:element name="password" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 


    <xs:element name="ADTest"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="ADConfig1"/> 
       <xs:element ref="ADConfig2"/> 
       </xs:sequence> 
     </xs:complexType> 
    </xs:element> 


    <xs:element name="ADConfig1"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element type="ADType1" name="AD"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="ADConfig2"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element type="ADType2" name="AD"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 


</xs:schema> 

ci-dessus a deux modèles ADType1 et ADType2 dont chacun peut être utilisé pour déclarer un élément nommé AD. Dans votre situation, vous pouvez créer un type global pour AD qui est utilisé dans l'élément ADConfig et un type différent qui pourrait être utilisé ailleurs. Si vous ne pouvez pas utiliser ce type de modèle (le type pour AD est défini ailleurs et corrigé), vous pouvez utiliser les annotations Schematron pour fournir le même type de validation pilotée par règles que celle qui sera fournie par XML Schema 1.1