Esquema XML: Elemento com atributos contendo apenas texto?

133

Estou tendo dificuldade em procurar por isso. Como eu definiria um elemento em um arquivo de esquema XML para XML parecido com este:

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

Não consigo descobrir como definir um elemento que é do tipo xs:stringe também tem um atributo.

Aqui está o que eu tenho até agora:

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

Respostas:

168

Experimentar

  <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
fonte
Estou recebendo a seguinte exceção ao tentar seu código - org.xml.sax.SAXParseException: src-resolve: Não é possível resolver o nome 'AttrElement' para um componente (n) de 'definição de tipo'. Por que?
Ashwin 28/05
1
Se for assim, provavelmente é porque o documento do esquema tem um espaço para nome de destino e você precisará usar um nome com prefixo para apontar para o tipo. (Se o prefixo tnsestiver vinculado ao espaço de nome de destino do documento do esquema, você usará type="tns:AttrElement"para se referir ao tipo.)
CM Sperberg-McQueen
@Ashwin que você pode precisar fazer referência o tipo com o tipo de espaço de nomes ( type="tns:AtrElement"se o seu namespace padrão do XSD é xs não o targetNamespace do documento Normalmente nesse caso. tnsÉ definido e usado.
Eckes
75

... ou o equivalente em linha:

<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
fonte
11
Acho realmente pouco intuitivo definir simpleContentdentro de a complexType. Mas, novamente, é XSD, onde nada parece realmente intuitivo. Obrigado mesmo assim! :-)
flu
Isso mostrará um erro para mim no IntelliJ ( V12.1.3 ): O atributo value é "não permitido". Usando complexContent em vez de simpleContent, foi corrigido.
Azen
@CrBruno é melhor abrir uma pergunta SO dedicada para isso. Sinta-se livre para link para ele aqui nos comentários (e apontam para este duscussion)
Eckes
-2

Eu sei que não é o mesmo, mas funciona para mim:

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