Schéma XML: élément avec des attributs contenant uniquement du texte?

133

J'ai du mal à le chercher. Comment définirais-je un élément dans un fichier de schéma XML pour XML qui ressemble à ceci:

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

Je ne peux pas comprendre comment définir un élément qui est de type xs:stringet qui a également un attribut.

Voici ce que j'ai jusqu'à présent:

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

Réponses:

168

Essayer

  <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
la source
J'obtiens l'exception suivante en essayant votre code - org.xml.sax.SAXParseException: src-resolution: Impossible de résoudre le nom «AttrElement» en un composant (n) «type definition». Pourquoi est-ce si?
Ashwin
1
Si tel est le cas, c'est probablement parce que votre document de schéma a un espace de noms cible et que vous devrez utiliser un nom préfixé pour pointer vers le type. (Si le préfixe tnsest lié à l'espace de noms cible du document de schéma, vous l'utiliserez type="tns:AttrElement"pour faire référence au type.)
CM Sperberg-McQueen
@Ashwin, vous devrez peut-être référencer le type avec l'espace de noms de type ( type="tns:AtrElement"si votre espace de noms par défaut du XSD n'est pas xs pas l'espace de noms cible du document. Dans ce cas, il tnsest généralement défini et utilisé.
eckes
75

... ou l'équivalent en ligne:

<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>
Julien H
la source
11
Je trouve vraiment peu intuitif de définir simpleContentdans un fichier complexType. Mais là encore, c'est XSD, où rien ne semble vraiment intuitif. Merci quand même! :-)
grippe
Cela affichera une erreur pour moi dans IntelliJ ( V12.1.3 ): l'attribut de valeur est "non autorisé". L'utilisation de complexContent au lieu de simpleContent l'a corrigé.
aZen
@CrBruno ferait mieux d'ouvrir une question SO dédiée à cela. N'hésitez pas à créer un lien vers celui-ci ici dans les commentaires (et pointez sur cette discussion)
eckes
-2

Je sais que ce n'est pas la même chose, mais ça marche pour moi:

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