XML-Schema: Element mit Attributen, die nur Text enthalten?


133

Ich habe Schwierigkeiten, danach zu suchen. Wie würde ich ein Element in einer XML-Schemadatei für XML definieren, das so aussieht:

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

Ich kann nicht herausfinden, wie man ein Element definiert, das vom Typ ist xs:stringund auch ein Attribut hat.

Folgendes habe ich bisher:

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

Antworten:


168

Versuchen

  <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>

Beim Versuch Ihres Codes wird die folgende Ausnahme angezeigt: org.xml.sax.SAXParseException: src-resolve: Der Name 'AttrElement' kann nicht in eine (n) 'Typdefinitions'-Komponente aufgelöst werden. Warum ist das so?
Ashwin

1
Wenn dies der Fall ist, liegt dies wahrscheinlich daran, dass Ihr Schemadokument einen Zielnamespace hat und Sie einen Präfixnamen verwenden müssen, um auf den Typ zu verweisen. (Wenn das Präfix tnsan den Ziel-Namespace des Schemadokuments gebunden ist type="tns:AttrElement", beziehen Sie sich auf den Typ.)
CM Sperberg-McQueen

@Ashwin Möglicherweise müssen Sie den Typ mit dem Typ-Namespace referenzieren ( type="tns:AtrElement"wenn Ihr Standard-Namespace der XSD xs ist, nicht der targetNamespace des Dokuments. In diesem Fall tnswird er
normalerweise

75

... oder das Inline-Äquivalent:

<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
Ich finde es wirklich nicht intuitiv, simpleContentinnerhalb eines zu definieren complexType. Aber andererseits ist es XSD, wo nichts wirklich intuitiv zu sein scheint. Trotzdem danke! :-)
Grippe

Dies zeigt einen Fehler für mich in IntelliJ ( V12.1.3 ): Das Wertattribut ist "nicht erlaubt". Die Verwendung von complexContent anstelle von simpleContent hat das Problem behoben.
aZen

@ CrBruno öffnen Sie besser eine dedizierte SO-Frage dafür. Fühlen Sie sich frei, hier in den Kommentaren darauf zu verlinken (und auf diese Diskussion zu verweisen)
eckes

-2

Ich weiß, dass es nicht dasselbe ist, aber es funktioniert für mich:

<xsd:element name="option">
    <xsd:complexType mixed="true">
        <xsd:attribute name="value" use="optional" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.