2011-03-28 18 views
6

¿Cómo puedo validar la longitud del texto del elemento que tiene un atributo? Ej:XSD para simplecontent con atributo y texto

<sport code="FB">Football</sport> 

Ahora necesito para restringir los posibles valores del atributo de código (como "FB", "BB", "TT") y también i necesita para restringir los valores posibles y la duración de la texto ("Football", "baloncesto", "TABLETENNIS") y también la longitud máxima de estos texto ("Football", "baloncesto", "TABLETENNIS") puede ser 20.

I trataron con

<complexType name="sport"> 
    <simpleContent> 
    <extension base="string"> 
     <attribute name="code" type="code" /> 
    </extension> 
    </simpleContent> 
</complexType> 
<simpleType name="code"> 
    <restriction base="string"> 
     <enumeration value="FB" /> 
     <enumeration value="BB" /> 
     <enumeration value="TT" /> 
    </restriction> 
</simpleType> 

Pero no puedo validar la longitud del texto "Foolball" (también el posible e values) ¿Puede ayudarnos sobre cómo validar el código y el texto? Gracias

+0

posible duplicado de [XML Schema: Elemento con atributos que contienen solo texto?] (Http://stackoverflow.com/questions/376582/xml-schema-element-with-attributes-containing-only-text) – Martijn

Respuesta

12

Tenía esta pregunta idéntica, y tenía la esperanza de que cuando vi había una respuesta aceptada. Sin embargo, esa respuesta es exactamente lo que probé, pero recibí un error de esquema no válido. Aparentemente, no puede restringir simpleContent dentro de un complexType, solo extenderlo. Además, no puede tener un atributo y simpleContent dentro de un complexType. La búsqueda de ejemplos en los libros alrededor de la oficina, se me ocurrió una solución, que me he adaptado a esta pregunta en caso de que alguien más tiene este problema en el futuro:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:sp="http://www.ckhrysze.net/sports/1.0" 
      targetNamespace="http://www.ckhrysze.net/sports/1.0" 
     > 

    <xsd:element name="sports"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="sport" type="sp:sportType" minOccurs="1" maxOccurs="unbounded" /> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

    <xsd:complexType name="sportType"> 
    <xsd:simpleContent> 
     <xsd:extension base="sp:sportEnumeration"> 
     <xsd:attribute name="code" type="sp:codeEnumeration" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
    </xsd:complexType> 

    <xsd:simpleType name="sportEnumeration"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="Football" /> 
     <xsd:enumeration value="Basketball" /> 
    </xsd:restriction> 
    </xsd:simpleType> 

    <xsd:simpleType name="codeEnumeration"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="FB" /> 
     <xsd:enumeration value="BB" /> 
    </xsd:restriction> 
    </xsd:simpleType> 

</xsd:schema> 
+0

muy retrasado En realidad, esto funcionó para mí, a diferencia de las soluciones anteriores. –

+0

Esto debe marcarse como la respuesta correcta ... –

-1

El elemento debe ser un tipo complejo en el que el contenido se basa en cadenas y está restringido por enumeración de la misma manera que para el atributo. Además, cuando restringes por enumeración, esto implica una longitud máxima.

Como nota al margen, no use los mismos nombres para los tipos y elementos/atributos ya que esto es confuso.

EDIT: Se ha añadido un ejemplo completo:

<element name="sport" type="tns:SportType" /> 

<complexType name="SportType"> 
    <simpleContent> 
     <restriction base="string"> 
      <enumeration value="Football" /> 
      <enumeration value="Basketball" /> 
     </restriction> 
    </simpleContent> 
    <attribute name="code" type="tns:CodeType" /> 
</complexType> 

<simpleType name="CodeType"> 
    <restriction base="string"> 
     <enumeration value="FB" /> 
     <enumeration value="BB" /> 
    </restriction> 
</simpleType> 
+0

Gracias. he modificado el elemento a "complexttype" y intentado añadir la "restricción" para los nombres de deporte ("Football") bajo el complejo de tipo "deporte". Pero no pude encontrar exactamente la forma correcta. – Thiyanesh

+0

Esto no parece validar. Recibo el error "**" atributo "y el modelo de contenido son mutuamente excluyentes **" en la etiqueta 'atributo'. Ver http://stackoverflow.com/questions/376582/xml-schema-element-with-attributes-containing-only-text para una mejor respuesta. – Martijn

+0

atributo y contentModel son mutuamente excluyentes – om471987

1

mi elemento:

<xsd:element name="From" type="FromType" minOccurs="0" maxOccurs="1"/> 

No valida los valores de corractly de la enumeración. Acepta todo.

<xsd:complexType name="FromType"> 
     <xsd:simpleContent> 
      <xsd:extension base="FromTypeEnum"> 
       <xsd:attribute name="acronym" type="xsd:string"/> 
      </xsd:extension> 
     </xsd:simpleContent> 
    </xsd:complexType> 

    <xsd:simpleType name="FromTypeEnum"> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="Discard"> 
       <xsd:annotation> 
        <xsd:documentation>Discard</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="SANDBOX"> 
       <xsd:annotation> 
        <xsd:documentation>SANDBOX</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="Catalogue"> 
       <xsd:annotation> 
        <xsd:documentation>Catalogue</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="Current experimentation"> 
       <xsd:annotation> 
        <xsd:documentation>Current experimentation</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="Current session"> 
       <xsd:annotation> 
        <xsd:documentation>Current session</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="Restart"> 
       <xsd:annotation> 
        <xsd:documentation>Restart</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
     </xsd:restriction> 
    </xsd:simpleType> 
0

La solución a su problema es crear un simpleContent con un extension cuya base está limitada de una manera y cuya attribute se ve limitada otra.

Este esquema XML:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="sport" type="sportType" /> 

    <xs:complexType name="sportType"> 
     <xs:simpleContent> 
      <xs:extension base="sportNameType"> 
       <xs:attribute name="code" type="sportCodeType" /> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 

    <xs:simpleType name="sportNameType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="Football" /> 
      <xs:enumeration value="Basketball" /> 
      <xs:maxLength value="20"/> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="sportCodeType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="FB" /> 
      <xs:enumeration value="BB" /> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

valida correctamente la deseada documento XML ejemplo:

<?xml version="1.0" encoding="UTF-8"?> 
<sport code="FB">Football</sport> 

Nota # 1: El elemento maxLength cumple con uno de sus requisitos, pero no es realmente necesario porque los nombres del deporte están enumerados.

Nota n. ° 2: Este esquema no impone la correlación entre el nombre deportivo y el código deportivo.En otras palabras, este esquema también valida este XML:

<?xml version="1.0" encoding="UTF-8"?> 
<sport code="BB">Football</sport> 

Para solucionar este problema, sería ya sea que tenga que utilizar Schematron o XSD 1.1.