2010-07-01 7 views
0

Ce que je cherche à être en mesure de créer est un XSD qui validerait les deux éléments suivants:schéma XML pour les éléments avec le même nom, mais différents éléments sous

<parent> 
<mother> 
    <name> 
    <firstname>foo</firstname> 
    <surname> bar </surname> 
    <maidenname>rab</maidenname> 
    </name> 
</mother> 
</parent> 

et

<parent> 
<father> 
    <name> 
    <firstname>foo</firstname> 
    <surname> bar </surname> 
    </name> 
</father> 
</parent> 

Je souhaite idéalement pouvoir utiliser le même nom d'élément mais avoir des exigences différentes en fonction de l'attribut parent. Ce que j'ai essayé jusqu'à présent est:

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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="firstname"> 
    <xs:complexType mixed="true" /> 
    </xs:element> 

    <xs:element name="maidenname"> 
    <xs:complexType mixed="true" /> 
    </xs:element> 

    <xs:element name="mother"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="name" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="father"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="name" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="name"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element ref="firstname" /> 
     <xs:element ref="surname" /> 
     <xs:element ref="maidenname" /> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="parent"> 
    <xs:complexType> 
    <xs:choice>         
     <xs:element ref="mother"/> 
     <xs:element ref="father"/> 
    </xs:choice> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="surname"> 
    <xs:complexType mixed="true" /> 
    </xs:element> 

</xs:schema> 

Répondre

0

Vous pouvez créer deux types différents (par exemple fathersName et mothersName) et les utiliser pour les name respectifs éléments. Voici la pleine XSD:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="firstname"> 
    <xs:complexType mixed="true" /> 
    </xs:element> 

    <xs:element name="maidenname"> 
    <xs:complexType mixed="true" /> 
    </xs:element> 

    <xs:element name="mother"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="name" type="mothersName" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="father"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="name" type="fathersName" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="fathersName"> 
    <xs:all> 
     <xs:element ref="firstname" /> 
     <xs:element ref="surname" /> 
    </xs:all> 
    </xs:complexType> 

    <xs:complexType name="mothersName"> 
    <xs:all> 
     <xs:element ref="firstname" /> 
     <xs:element ref="surname" /> 
     <xs:element ref="maidenname" /> 
    </xs:all> 
    </xs:complexType> 

    <xs:element name="parent"> 
    <xs:complexType> 
     <xs:choice> 
     <xs:element ref="mother"/> 
     <xs:element ref="father"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="surname"> 
    <xs:complexType mixed="true" /> 
    </xs:element> 

</xs:schema> 

En outre, si les noms sont censés être des chaînes simples, vous pourriez écrire le XSD d'une manière plus concise:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="mother"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="name" type="mothersName" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="father"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="name" type="fathersName" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="fathersName"> 
    <xs:all> 
     <xs:element name="firstname" type="xs:string" /> 
     <xs:element name="surname" type="xs:string" /> 
    </xs:all> 
    </xs:complexType> 

    <xs:complexType name="mothersName"> 
    <xs:all> 
     <xs:element name="firstname" type="xs:string" /> 
     <xs:element name="surname" type="xs:string" /> 
     <xs:element name="maidenname" type="xs:string" /> 
    </xs:all> 
    </xs:complexType> 

    <xs:element name="parent"> 
    <xs:complexType> 
     <xs:choice maxOccurs="unbounded"> 
     <xs:element ref="mother"/> 
     <xs:element ref="father"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Enfin, vous pouvez écrire mothersName comme extension de fathersName, mais cela a un coût: l'ordre des éléments doit être (au moins partiellement) fixé. Voici comment les deux définitions de type regarderaient:

<!-- ... --> 

    <xs:complexType name="fathersName"> 
    <xs:sequence> 
     <xs:element name="firstname" type="xs:string" /> 
     <xs:element name="surname" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="mothersName"> 
    <xs:complexContent> 
     <xs:extension base="fathersName"> 
     <xs:sequence> 
      <xs:element name="maidenname" type="xs:string" /> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <!-- ... --> 
+0

Salut @bolo pouvez-vous s'il vous plaît répondre à cette question aussi, il est similaire: http://stackoverflow.com/q/39751548/3735638?sem=2 –

Questions connexes