2009-03-09 11 views
59

El problema es el siguiente:añadir atributos a una simpleType o restricción a un complexType en esquemas XML

tengo el siguiente fragmento de código XML:

<time format="minutes">11:60</time> 

El problema es que no puedo añadir tanto el atributo y la restricción al mismo tiempo. El formato de atributo solo puede tener los valores minutos, horas y segundos. El tiempo tiene la restrictionpattern \d{2}:\d{2}

<xs:element name="time" type="timeType"/> 
... 
<xs:simpleType name="formatType"> 
<xs:restriction base="xs:string"> 
    <xs:enumeration value="minutes"/> 
    <xs:enumeration value="hours"/> 
    <xs:enumeration value="seconds"/> 
</xs:restriction> 
</xs:simpleType> 
<xs:complexType name="timeType"> 
    <xs:attribute name="format"> 
     <xs:simpleType> 
      <xs:restriction base="formatType"/> 
     </xs:simpleType> 
    </xs:attribute> 
</xs:complexType> 

Si hago un tipo complejo de timeType, puedo añadir un atributo, pero no la restricción, y si hago un tipo simple, que se puede añadir la restricción, pero no el atributo . ¿Hay alguna forma de evitar este problema? Esta no es una restricción muy extraña, ¿o sí?

Respuesta

110

Para agregar atributos debe derivar por extensión, para agregar facetas que tiene que derivar por restricción. Por lo tanto, esto tiene que hacerse en dos pasos para el contenido secundario del elemento. El atributo se puede definir en línea:

<xsd:simpleType name="timeValueType"> 
    <xsd:restriction base="xsd:token"> 
    <xsd:pattern value="\d{2}:\d{2}"/> 
    </xsd:restriction> 
</xsd:simpleType> 

<xsd:complexType name="timeType"> 
    <xsd:simpleContent> 
    <xsd:extension base="timeValueType"> 
     <xsd:attribute name="format"> 
     <xsd:simpleType> 
      <xsd:restriction base="xsd:token"> 
      <xsd:enumeration value="seconds"/> 
      <xsd:enumeration value="minutes"/> 
      <xsd:enumeration value="hours"/> 
      </xsd:restriction> 
     </xsd:simpleType> 
     </xsd:attribute> 
    </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 
+0

¡Muchísimas gracias! – t1gor

1

me gustaría proponer mi ejemplo con una explicación más detallada de lo que realmente requiere para mezclar tipo hereditario con restricciones mientras que la adición de atributos.

este es el lugar donde define su tipo heredado (en mi caso, es xs: cadena basada en una restricción de longitud de campo 1024). no puede tener esto como un tipo estándar para su campo ya que también va a agregar un "atributo" a su campo.

<xs:simpleType name="string1024Type"> 
    <xs:restriction base="xs:string"> 
     <xs:maxLength value="1024"/> 
    </xs:restriction> 
    </xs:simpleType> 

este es el lugar donde se define el elemento base a su tipo privado (en mi caso es "string1024Type") y el atributo necesario anexa:

<xs:element maxOccurs="unbounded" name="event"> 
    <xs:complexType> 
    <xs:simpleContent> 
     <xs:extension base="string1024Type"> 
     <xs:attribute default="list" name="node" type="xs:string"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

ambos bloques podrían estar en lugares completamente separados de tu esquema el punto importante es seguirlo una vez más: no se puede mezclar herencia y atribuir en la misma definición de elemento.

Cuestiones relacionadas