Agregue atributos a un tipo simple o restricción a un tipo complejo en el esquema Xml

StackOverflow https://stackoverflow.com/questions/626319

  •  06-07-2019
  •  | 
  •  

Pregunta

El problema es el siguiente:

Tengo el siguiente fragmento de XML:

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

El problema es que no puedo agregar tanto el atributo como la restricción al mismo tiempo. El formato de atributo solo puede tener los valores minutos, horas y segundos. El tiempo tiene el patrón de restricción \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 agregar un atributo, pero no la restricción, y si hago un tipo simple, puedo agregar la restricción pero no el atributo. ¿Hay alguna forma de solucionar este problema? Esta no es una restricción muy extraña, ¿o sí?

¿Fue útil?

Solución

Para agregar atributos debe derivar por extensión, para agregar facetas debe derivar por restricción. Por lo tanto, esto debe 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>

Otros consejos

Me gustaría proponer mi ejemplo con una explicación más detallada de lo que realmente se requiere para mezclar el tipo heredado con restricciones al agregar el atributo.

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

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

este es el lugar donde su elemento se define en función de su tipo privado (en mi caso es " string1024Type ") y el atributo necesario agregado:

<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 su esquema. el punto importante es solo seguir una vez más: no puede mezclar herencia y atribuir en la misma definición de elemento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top