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.