web-dev-qa-db-ger.com

XML-Schema So schränken Sie das Attribut durch Aufzählung ein

Ich habe das folgende XML-Tag

<price currency="euros">20000.00</price>

Wie beschränke ich das Währungsattribut auf Folgendes:

  • euro
  • pfund
  • dollar

UND der Preis für ein Doppel?

Ich bekomme nur eine Fehlermeldung, wenn ich auf beiden einen Tipp versuche. Folgendes habe ich bisher:

<xs:element name="price">
    <xs:complexType>
        <xs:attribute name="currency" type="xs:string">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="pounds" />
                    <xs:enumeration value="euros" />
                    <xs:enumeration value="dollars" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>
82
Luke

Der numerische Wert scheint in Ihrer Preisdefinition zu fehlen. Versuche Folgendes:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>



<xs:element name="price">
        <xs:complexType>
            <xs:extension base="xs:decimal">
              <xs:attribute name="currency" type="curr"/>
            </xs:extension>
        </xs:complexType>
</xs:element>
111
user998692

Neue Antwort auf alte Frage

Keine der vorhandenen Antworten auf diese alte Frage behandelt das echte Problem.

Das eigentliche Problem war, dass xs:complexType Nicht direkt einen xs:extension Als haben kann Kind in XSD. Das Update besteht darin, zuerst xs:simpleContent Zu verwenden. Details folgen ...


Ihre XML,

<price currency="euros">20000.00</price>

gilt für entweder der folgenden korrigierten XSDs:

Lokal definierter Attributtyp

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

Global definierter Attributtyp

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="currencyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="pounds" />
      <xs:enumeration value="euros" />
      <xs:enumeration value="dollars" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency" type="currencyType"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

Anmerkungen

  • Wie kommentiert von @Paul , ändern diese den Inhaltstyp von price von xs:string In xs:decimal, Dies ist jedoch nicht unbedingt erforderlich und war es auch nicht das eigentliche Problem.
  • Als beantwortet von @ user998692 konnten Sie die Definition der Währung trennen und in xs:decimal Ändern, aber auch dies war nicht das eigentliche Problem.

Das eigentliche Problem war, dass xs:complexType Als Kind in XSD nicht direkt einen xs:extension Haben kann; xs:simpleContent Wird zuerst benötigt.

Eine verwandte Angelegenheit (die nicht gestellt wurde, aber möglicherweise andere Antworten verwirrt hat):

Wie könnte price eingeschränkt werden, wenn es ein Attribut hat?

In diesem Fall wäre eine separate, globale Definition von priceType erforderlich. Dies ist nicht nur mit lokalen Typdefinitionen möglich.

So schränken Sie den Elementinhalt ein, wenn das Element ein Attribut hat

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="priceType">  
    <xs:restriction base="xs:decimal">  
      <xs:minInclusive value="0.00"/>  
      <xs:maxInclusive value="99999.99"/>  
    </xs:restriction>  
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="priceType">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>
21
kjhughes

sie müssen einen Typ erstellen und das Attribut dieses Typs erstellen:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>

dann:

<xs:complexType>
    <xs:attribute name="currency" type="curr"/>
</xs:complexType>
7
A.B.Cade