Schema XML Come limitare l'attributo in base all'enumerazione


86

Ho il seguente tag XML

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

Come faccio a limitare l'attributo valuta a uno dei seguenti:

  • euro
  • libbre
  • dollari

E il prezzo al doppio?

Ricevo solo un errore quando provo a digitare su entrambi, ecco cosa ho ottenuto finora:

<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
Se lo fai, devi rimuovere type = "xs: string" anche dall'elemento <xs: attribute>. Non è possibile fornire il tipo quando è presente simpleType o complexType.
Sal

Risposte:


117

Il valore numerico sembra mancare dalla definizione del prezzo. Prova quanto segue:

<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
Come risposto da @kjhughes, <xs:extensionnon può essere direttamente un figlio di <xs:complexTypema deve essere contenuto anche da un <xs:complexContento <xs:simpleContent.
HankCa

22

Nuova risposta alla vecchia domanda

Nessuna delle risposte esistenti a questa vecchia domanda affronta il vero problema.

Il vero problema era chexs:complexTypenon può avere direttamentexs:extensionun figlio in XSD. La soluzione è usarexs:simpleContentprima. Seguono i dettagli ...


Il tuo XML,

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

sarà valido contro uno dei seguenti XSD corretti:

Tipo di attributo definito localmente

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

Tipo di attributo definito a livello globale

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

Appunti

  • Come commentato da @Paul , questi cambiano il tipo di contenuto priceda xs:stringa xs:decimal, ma questo non è strettamente necessario e non era il vero problema.
  • Alla risposta di @ user998692 , potresti separare la definizione di valuta e potresti passare a xs:decimal, ma anche questo non era il vero problema.

Il vero problema era che xs:complexTypenon può avere direttamente xs:extensionun figlio in XSD; xs:simpleContentè necessario prima.

Una questione correlata (che non è stata richiesta ma potrebbe aver confuso altre risposte):

Come potrebbe priceessere limitato dato che ha un attributo?

In questo caso, priceTypesarebbe necessaria una definizione globale separata di ; non è possibile farlo solo con definizioni di tipo locale.

Come limitare il contenuto dell'elemento quando l'elemento ha un attributo

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

devi creare un tipo e rendere l'attributo di quel tipo:

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

poi:

<xs:complexType>
    <xs:attribute name="currency" type="curr"/>
</xs:complexType>

Ciao, purtroppo questo non mi consente di limitare il tipo di prezzo a "raddoppiare" E l'enumerazione delle restrizioni sull'attributo "valuta" allo stesso tempo
Luca

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

Ciò eliminerebbe completamente la necessità di enumerazione. È possibile modificare il tipo in doppio, se necessario.


@valuenon può apparire xs:attribute. xs:attributenon può apparire come figlio di xs:element. I xs:prefissi dello spazio dei nomi necessari vengono omessi. Questa risposta è un disastro e dovrebbe essere semplicemente cancellata.
kjhughes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.