xsd - simple - ¿Cómo se definen varios elementos en el esquema XML con el mismo nombre y el valor de atributo diferente permitido?
xml schema simple (5)
¿Has considerado algo como esto? (es decir, el día es un tipo y los elementos se nombran después de los días de la semana)
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="day" />
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element name="monday" maxOccurs="1" minOccurs="0" type="day" />
<xs:element name="tuesday" maxOccurs="1" minOccurs="0" type="day" />
<xs:element name="wednesday" maxOccurs="1" minOccurs="0" type="day" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Me gustaría crear un esquema XML para este trozo de xml, me gustaría restringir los valores del atributo "nombre", de modo que en el documento de salida y solo se permita una instancia del día para cada día de la semana:
<a>
<day name="monday" />
<day name="tuesday" />
<day name="wednesday" />
</a>
He intentado usar esto:
<xs:complexType name="a">
<xs:sequence>
<xs:element name="day" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="monday" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="day" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="tuesday" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
pero el validador de esquemas XML en eclipse dice "Aparecen varios elementos con el nombre ''día'', con diferentes tipos, en el grupo de modelos".
¿Hay alguna otra manera?
Prueba esto:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="day">
<xs:complexType>
<xs:attribute name="atrib" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Creo que maxOccurs = "ilimitado" es lo que necesitas.
Necesitas algo como esto:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="day"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="day">
<xs:complexType>
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="monday"/>
<xs:enumeration value="tuesday"/>
<xs:enumeration value="wednesday"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>
Utilice la opción en lugar de la secuencia
De esta forma puedes tener solo el elemento uno en un elemento
Y para el atributo de nombre use el atributo ref y haga referencia a él con enumeración
Para cumplir con la restricción a lo sumo descrita en la pregunta original, debe usar un elemento xs: unique en su esquema.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element name="day" maxOccurs="7" minOccurs="1">
<xs:complexType>
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="(mon|tues|wednes|thurs|fri|satur|sun)day"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
<xs:unique name="eachDayAtMostOnce">
<xs:selector xpath="day"/>
<xs:field xpath="@name"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>