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>
Luke
quelle
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>
user998692
quelle
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>
kjhughes
quelle
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>
ABCade
quelle
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.

Nachiket Kulkarni
quelle
@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