XML-Schema So beschränken Sie Attribute durch Aufzählung


84

Ich habe das folgende XML-Tag

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

Wie beschränke ich das Währungsattribut auf eines der folgenden:

  • Euro
  • Pfund
  • Dollar

UND der Preis zu einem Doppel?

Ich erhalte nur eine Fehlermeldung, wenn ich versuche, einen Typ für beide zu verwenden. Folgendes habe ich bisher:

<xs:element name="price">
    <xs:complexType>
        <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:complexType>
</xs:element>

1
In diesem Fall müssen Sie auch type = "xs: string" aus dem Element <xs: attribute> entfernen. Sie können den Typ nicht angeben, wenn simpleType oder complexType vorhanden ist.
Sal

Antworten:


115

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>

3
Wie von @kjhughes beantwortet, <xs:extensionkann das nicht direkt ein Kind von sein, <xs:complexTypesondern muss auch in einem <xs:complexContentoder enthalten sein <xs:simpleContent.
HankCa

21

Neue Antwort auf alte Frage

Keine der vorhandenen Antworten auf diese alte Frage befasst sich mit dem eigentlichen Problem.

Das eigentliche Problem war, dassxs:complexTypemanxs:extensionals Kind in XSDnicht direkt einen haben kann. Das Update ist zuerst zu verwendenxs:simpleContent. Details folgen ...


Ihr XML,

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

wird gegen gültig entweder den folgenden korrigiert 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 von @Paul kommentiert, ändern diese zwar den Inhaltstyp von pricevon xs:stringnach xs:decimal, dies ist jedoch nicht unbedingt erforderlich und war nicht das eigentliche Problem.
  • Wie von @ user998692 beantwortet , können Sie die Definition der Währung trennen und zu ändern xs:decimal, aber auch dies war nicht das eigentliche Problem.

Das eigentliche Problem war, dass xs:complexTypeman xs:extensionals Kind nicht direkt eine XSD haben kann; xs:simpleContentwird zuerst benötigt.

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

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

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

So beschränken Sie den Elementinhalt, 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>

8

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>

Hallo, leider erlaubt mir dies nicht, den Preistyp auf "doppelt" UND die Beschränkungsaufzählung für das Attribut "Währung" gleichzeitig zu beschränken
Luke

-2
<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" /> 
</element> 

Dies würde die Notwendigkeit einer Aufzählung vollständig beseitigen. Sie können den Typ bei Bedarf in double ändern.


@valuekann nicht auf erscheinen xs:attribute. xs:attributekann nicht als Kind von erscheinen xs:element. Erforderliche xs:Namespace-Präfixe werden weggelassen. Diese Antwort ist ein Chaos und sollte einfach gelöscht werden.
kjhughes
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.