web-dev-qa-db-de.com

Hinzufügen von Attributen zu einem einfachen Typ oder Beschränkung auf einen komplexen Typ im XML-Schema

Das Problem ist wie folgt:

Ich habe das folgende XML-Snippet:

<time format="minutes">11:60</time>

Das Problem ist, dass ich nicht gleichzeitig das Attribut und die Einschränkung hinzufügen kann. Das Attributformat kann nur die Werte Minuten, Stunden und Sekunden enthalten. Die Zeit hat das Restriktionsmuster \d{2}:\d{2}

<xs:element name="time" type="timeType"/>
...
<xs:simpleType name="formatType">
<xs:restriction base="xs:string">
    <xs:enumeration value="minutes"/>
    <xs:enumeration value="hours"/>
    <xs:enumeration value="seconds"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="timeType">
    <xs:attribute name="format">
        <xs:simpleType>
            <xs:restriction base="formatType"/>
        </xs:simpleType>
    </xs:attribute>
</xs:complexType>

Wenn ich einen komplexen timeType-Typ erstelle, kann ich ein Attribut hinzufügen, aber nicht die Einschränkung. Wenn ich einen einfachen Typ erstelle, kann ich die Einschränkung, aber nicht das Attribut hinzufügen. Gibt es eine Möglichkeit, dieses Problem zu umgehen? Dies ist keine sehr merkwürdige Einschränkung, oder?

64
Ikke

Um Attribute hinzuzufügen, müssen Sie nach Erweiterung ableiten, um Facetten hinzuzufügen, müssen Sie nach Einschränkung ableiten. Daher muss dies für den untergeordneten Inhalt des Elements in zwei Schritten erfolgen. Das Attribut kann inline definiert werden:

<xsd:simpleType name="timeValueType">
  <xsd:restriction base="xsd:token">
    <xsd:pattern value="\d{2}:\d{2}"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="timeType">
  <xsd:simpleContent>
    <xsd:extension base="timeValueType">
      <xsd:attribute name="format">
        <xsd:simpleType>
          <xsd:restriction base="xsd:token">
            <xsd:enumeration value="seconds"/>
            <xsd:enumeration value="minutes"/>
            <xsd:enumeration value="hours"/>
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>
117
Richard

Ich möchte mein Beispiel mit einer detaillierteren Erklärung vorschlagen, was tatsächlich erforderlich ist, um beim Hinzufügen eines Attributs den geerbten Typ mit Einschränkungen zu verwechseln.

dies ist der Ort, an dem Sie Ihren geerbten Typ definieren (in meinem Fall ist es xs: string based one mit Feldlängenbeschränkung 1024). Sie können dies nicht als Standardtyp für Ihr Feld festlegen, da Sie Ihrem Feld auch ein "Attribut" hinzufügen werden.

  <xs:simpleType name="string1024Type">
    <xs:restriction base="xs:string">
      <xs:maxLength value="1024"/>
    </xs:restriction>
  </xs:simpleType>

dies ist der Ort, an dem Ihr Element basierend auf Ihrem privaten Typ (in meinem Fall "string1024Type") und dem angehängten erforderlichen Attribut definiert wird:

<xs:element maxOccurs="unbounded" name="event">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="string1024Type">
        <xs:attribute default="list" name="node" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

beide Blöcke können sich an völlig unterschiedlichen Stellen Ihres Schemas befinden. der wichtige Punkt folgt nur noch einmal - Sie können Vererbung und Attributierung nicht in derselben Elementdefinition mischen.

2
Oleg Kokorin