Вы не можете объявить два элемента с одним и тем же именем с разными типами в одном контексте, но я думаю, что понимаю, что вы хотите сделать.
Если бы у вас действительно были элементы с очень разным содержанием, было бы разумно создать два типа (и было бы также разумно, чтобы они имели разные имена или, по крайней мере, встречались в другом контексте). Поскольку ваши данные схожи, а основное различие заключается в атрибуте, который описывает текстовое содержимое элемента, вы можете создать один тип и ограничить значения, которые атрибут может получать:
<xs:complexType name="languageType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="lang" use="required">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="ENG"/>
<xs:enumeration value="CES"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
В languageType
выше у вас есть простое содержимое (xs:string
) и обязательный атрибут lang
, который может иметь только два значения: ENG
или CES
.
Если вы хотите гарантировать, что есть ровно два элемента, вы можете ограничить это в своем определении template_data
элемента с помощью minOccurs="2"
и maxOccurs="2"
для given_name
дочернего элемента:
<xs:element name="template_data">
<xs:complexType>
<xs:sequence>
<xs:element name="given_name" type="languageType" minOccurs="2" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
...
Теперь все еще возможно иметь два given_name
элемента с одинаковым атрибутом lang="ENG"
. Чтобы ограничить это, мы можем добавить определение xs:key
в контексте определения элемента template_data
:
<xs:element name="template_data">
<xs:complexType> ... </xs:complexType>
<xs:key name="languageKey">
<xs:selector xpath="given_name" />
<xs:field xpath="@lang"/>
</xs:key>
</xs:element>
xs:key
использует вложенный given_name
в качестве селектора и его атрибут lang
в качестве ключевого поля. Он не разрешит дублирование полей, а это означает, что он не позволит использовать два given_name
элемента с одинаковыми lang
атрибутами. Поскольку вы разрешаете только два, а они могут быть только ENG
или CES
, один должен быть ENG
, а другой CES
.
Теперь этот XML-документ проверяет:
<template_data>
<given_name lang="ENG">Zluty</given_name>
<given_name lang="CES">Žlutý</given_name>
</template_data>
<template_data>
<given_name lang="CES">Žlutý</given_name>
<given_name lang="ENG">Zluty</given_name>
</template_data>
Но это не так:
<template_data>
<given_name lang="FRA">Zluty</given_name>
<given_name lang="CES">Žlutý</given_name>
<given_name lang="ENG">Zluty</given_name>
</template_data>
<template_data>
<given_name lang="ENG">Zluty</given_name>
<given_name lang="ENG">Zluty</given_name>
</template_data>
<template_data>
<given_name lang="ENG">Zluty</given_name>
</template_data>
<template_data>
<given_name>Zluty</given_name>
<given_name lang="ENG">Zluty</given_name>
</template_data>
person
helderdarocha
schedule
12.03.2014
restriction
(w3schools.com/schema/schema_facets. asp) и сfixed
в атрибутах (w3schools.com/schema/schema_simple_attributes.asp) или с типами. - person Humungus   schedule 12.03.2014