Esquema XML: ¿Elemento con atributos que solo contienen texto?

133

Tengo dificultades para buscar esto. ¿Cómo definiría un elemento en un archivo de esquema XML para XML con este aspecto?

<option value="test">sometext</option>

No puedo entender cómo definir un elemento que es de tipo xs:stringy también tiene un atributo.

Esto es lo que tengo hasta ahora:

<xs:element name="option">
    <xs:complexType>
        <xs:attribute name="value" type="xs:string" />
    </xs:complexType>
</xs:element>
Wilco
fuente

Respuestas:

168

Tratar

  <xs:element name="option" type="AttrElement" />

  <xs:complexType name="AttrElement">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="value" type="xs:string">
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
David Norman
fuente
Recibo la siguiente excepción al probar su código: org.xml.sax.SAXParseException: src-resolve: No se puede resolver el nombre 'AttrElement' a un componente (n) 'definición de tipo'. ¿Por qué es así?
Ashwin
1
Si es así, probablemente se deba a que su documento de esquema tiene un espacio de nombres de destino y necesitará usar un nombre prefijado para señalar el tipo. (Si el prefijo tnsestá vinculado al espacio de nombres de destino del documento de esquema, usará type="tns:AttrElement"para referirse al tipo).
CM Sperberg-McQueen
@Ashwin, es posible que deba hacer referencia al tipo con el espacio de nombres de tipo ( type="tns:AtrElement"si su espacio de nombres predeterminado de XSD no es xspaceNamespace del documento. Por lo general, en ese caso tnsse define y se usa.
eckes
75

... o el equivalente en línea:

<xs:element name="option">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="value" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>
Julian H
fuente
11
Me parece muy poco intuitivo definir simpleContentdentro de a complexType. Pero, de nuevo, es XSD, donde nada parece realmente intuitivo. Gracias de todos modos! :-)
gripe
Esto me mostrará un error en IntelliJ ( V12.1.3 ): el atributo de valor "no está permitido". El uso de complexContent en lugar de simpleContent lo arregló.
aZen
@CrBruno abre mejor una pregunta SO dedicada para esto. Siéntase libre de vincularlo aquí en los comentarios (y señalar esta discusión)
eckes
-2

Sé que no es lo mismo, pero funciona para mí:

<xsd:element name="option">
    <xsd:complexType mixed="true">
        <xsd:attribute name="value" use="optional" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>
Aitor
fuente