2011-10-07 340 views
9

Quiero declarar que un elemento se incluya en una declaración de tipo complejo, y el elemento tiene un atributo obligatorio: "opción = MiOpción", pero el valor de la "opción" atributo podría ser cualquier cosa, según el contexto.Elemento Obligatorio Declaración de atributo en XSD Esquema:

Es decir: el atributo "opción" con algún valor desconocido debe ser obligatorio en cualquier documento que utilice el tipo complejo que contiene este elemento.

Ejemplo:

<xs:element name="SpecialOption" type="xs:string"/> 

    <xs:complexType name="SpecialOptions"> 
     <xs:sequence> 
      <xs:element ref="SpecialOption" minOccurs="1" maxOccurs="100"/> 
      <xs:element ref="XXX"/>  
     </xs:sequence> 
    </xs:complexType> 

En este caso el elemento "SpecialOption" en el tipo complejo "SpecialOptions" debe tener este atributo obligatorio.

No sé cómo declarar un atributo obligatorio para un elemento en XSD, o cómo especificar que el atributo debe tener un valor que aún no se conoce.

Respuesta

23

Debe modificar la definición del elemento "SpecialOption" para incluir el atributo requerido. Actualizar este código:

<xs:element name="SpecialOption" type="xs:string"/> 

a esto:

<xs:element name="SpecialOption"> 
    <xs:complexType> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute name="Option" type="xs:string" use="required"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

Con este complejo de cambiar el tipo de complejo contendrá el atributo necesario "opción" en todas las instancias del elemento "SpecialOption" en los "SpecialOptions" tipo. Declarar que el atributo "Opción" es del tipo xs:string permitirá que se pase cualquier valor en este campo.

+0

Suena bien, esto es lo que necesitaba saber: cómo hacer que el atributo sea un componente obligatorio del elemento. "Declarar que el atributo" Opción "es del tipo xs: cadena permitirá que se pase cualquier valor en este campo." Entendido, pero me será más útil declarar un tipo de enumeración y expandirlo a medida que evolucionen mis necesidades. Intentaremos tu código: si funciona, tienes recompensa. – Vector

3

Para marcar un atributo como obligatorio, utilice <xs:attribute use="required" />.

En cuanto al tipo, puede elegir entre los tipos de XSD integrados (xs: cadena, etc.), o puede definir su propio <xs:simpleType /> y usarlo.

ACTUALIZACIÓN

No estoy seguro de lo que entendemos por el atributo debe tener un valor que aún no se conoce. ¿Esto significa que el valor es una cadena, pero puede ser cualquier cadena? ¿O un decimal?

Dado que se trata de un valor de atributo que estamos refiriendo a que está restringido a utilizar los tipos incorporados de XSD, o la definición de su propio tipo xs:simpleType basado en uno de los tipos incorporados. Aquí es donde puede aplicar reglas más estrictas al valor permitido, por ejemplo, extendiendo xs:string y agregando una restricción de expresión regular a los valores permitidos.

<xsd:simpleType name="UKDate"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:pattern value="(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)\d\d"/> 
    </xsd:restriction> 
</xsd:simpleType> 

Sin embargo, si no hay absolutamente ninguna manera de saber qué valor se utilizará entonces usted tiene la paradoja temporal bien conocida por la cual no se puede restringir algo en tiempo de diseño a un valor sólo se conoce en tiempo de ejecución. En este caso, seguramente solo es necesario especificar que el atributo al menos debe estar presente.

<xs:attribute use="required" />

la esperanza que esto responda a su pregunta un poco más claramente.

+0

No es mucho más claro: no ha explicado cómo declarar un elemento que incluye un atributo obligatorio. – Vector

15

1) Este es un simple cadena requerida atributo

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" type="xs:string" use="required"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

2) Para requerir exactamente una de una lista de valores permitidos:

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" use="required"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:enumeration value="DE"/> 
          <xs:enumeration value="EN"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

3) Se puede utilizar un rango como una restricción , como en el ejemplo de abajo.

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" use="required"> 
        <xs:simpleType> 
         <xs:restriction base="xs:integer"> 
          <xs:minInclusive value="95"/> 
          <xs:maxInclusive value="137"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

4) A continuación, el atributo se declara como una lista que contiene valores decimales. Esto permite que un atributo contenga un subconjunto de los valores especificados, p. Opción = "6 77 95".

<xs:simpleType name="Items"> 
    <xs:restriction base="xs:decimal"> 
     <xs:enumeration value="137"/> 
     <xs:enumeration value="95"/> 
     <xs:enumeration value="6"/> 
     <xs:enumeration value="77"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" use="required"> 
        <xs:simpleType> 
         <xs:list itemType="Items"/> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

5) A continuación, el atributo se declara opcional, pero siempre con un valor por defecto ("test"), que a veces es suficiente:

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" type="xs:string" use="optional" default="test"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 
+0

+1 - Tu respuesta es detallada y muy informativa, pero di la recompensa de responder 2 porque era suficiente y mucho antes que la tuya. Tnx – Vector

+0

Gracias, sin embargo, fue a tiempo y tomé sus comentarios en cuenta. Sin embargo, entiendo que la respuesta 2 fue suficiente, así que no hay problema:] – mousio

0

Basta con que puede hacerlo de la siguiente manera

<xs:element name="SpecialOption"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:whiteSpace value="replace"/> 
      <xs:minLength value="1"></xs:minLength> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 

Mediante este código, usted exige insertar un valor en la etiqueta xml y también la restricción de espacio en blanco se encargará de eliminar el espacio en blanco de la etiqueta xml.

Cuestiones relacionadas