Вы можете создать два разных типа (например, fathersName
и mothersName
) и использовать их для соответствующих элементов name
. Вот полный 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>
Кроме того, если имена должны быть простыми строками, вы можете написать XSD более кратким способом:
<?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>
Наконец, вы можете написать mothersName
как расширение fathersName
, но это связано с расходами: порядок элементов должен быть (хотя бы частично) фиксированным. Вот как будут выглядеть определения двух типов:
<!-- ... -->
<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>
<!-- ... -->