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>

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>

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>

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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.