2008-10-07 18 views
7

Me gustaría crear un Esquema XML para este trozo de xml, me gustaría restringir los valores del atributo "nombre", para que en el documento de salida y solo una instancia del día esté permitida para cada día de la semana:¿Cómo se definen los elementos múltiples en el esquema XML con el mismo nombre y el valor de atributo diferente permitido?

<a> 
    <day name="monday" /> 
    <day name="tuesday" /> 
    <day name="wednesday" /> 
</a> 

he tratado de utilizar este:

<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 esquema XML validador en Eclipse dice error "elementos múltiples con 'día', nombre con diferentes tipos, aparecer en el modelo de grupo.".

¿Hay alguna otra manera?

Respuesta

12

se necesita 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> 
+0

José, esto hizo el truco, gracias por su ayuda. –

+2

No, esto no funciona. Si el objetivo es permitir el elemento uno-y-uno para el nombre de cada día, este esquema no lo hará. Necesita usar xs: unique para estipular formalmente la restricción de cada día a lo sumo. – Cheeso

0

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 el maxOcurrencias = "sin límites" es lo que necesita.

+0

Quería restringir también los valores del atributo, he aclarado la pregunta en consecuencia. –

0

¿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> 
+0

Sí, lo hice, en realidad uso exactamente esto ahora, pero el diseño xml cuestionado me pareció más apropiado. Gracias de cualquier manera. –

0

Uso elección en lugar de la secuencia

Por eso forma en que puede tener solo el elemento elemento uno en un elemento

Y para el atributo de nombre use el atributo ref y remítalo a la enumeración

7

Para cumplir con la restricción a lo sumo descrita en la pregunta original, necesita 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> 
Cuestiones relacionadas