XML Şeması Öznitelik Numaralandırmaya Göre Nasıl Kısıtlanır


86

Aşağıdaki XML Etiketine sahibim

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

Para birimi özelliğini aşağıdakilerden biriyle nasıl sınırlayabilirim:

  • euro
  • pound
  • dolar

VE bir çift için fiyat?

Her ikisinde de bir yazı yazmaya çalıştığımda bir hata alıyorum, işte şu ana kadar elde ettiğim şey:

<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
Bunu yaparsanız, <xs: attribute> öğesinden type = "xs: string" öğesini de kaldırmanız gerekir. SimpleType veya complexType mevcut olduğunda türü veremezsiniz.
Sal

Yanıtlar:


117

Fiyat tanımınızda sayısal değer eksik görünüyor. Takip etmeyi dene:

<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
@Kjhughes tarafından yanıtlandığı gibi, <xs:extensiondoğrudan bir çocuğu olamaz, <xs:complexTypebunun yerine a <xs:complexContentveya ile de dahil edilmelidir <xs:simpleContent.
HankCa

22

Eski soruya yeni cevap

Bu eski soruya verilen mevcut cevapların hiçbiri gerçek sorunu ele almıyor.

Asıl sorun ,XSD'de bir çocuk olarakxs:complexTypedoğrudan olamamaktıxs:extension. Düzeltme önce kullanmaktırxs:simpleContent. Ayrıntılar takip edin ...


XML'iniz,

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

karşı geçerli olacak ya aşağıdaki düzeltilmiş XSD'ler arasında:

Yerel olarak tanımlanmış öznitelik türü

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

Küresel olarak tanımlanmış öznitelik türü

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

Notlar

  • As @ Paul tarafından yorumladı , bunların içerik türünü değiştiririm pricegelen xs:stringetmekxs:decimal , ancak bu kesinlikle gerekli değildir ve gerçek bir sorun değildi.
  • @ User998692 tarafından yanıtlandığı gibi , para biriminin tanımını ayırabilirdiniz ve olarak değiştirebilirsiniz xs:decimal, ancak bu da gerçek sorun değildi.

Asıl sorun , XSD'de bir çocuk olarak xs:complexTypedoğrudan olamamaktı xs:extension;xs:simpleContentönce gerekli.

İlgili bir konu (sorulmamış ancak diğer cevapları karıştırmış olabilir):

Nasıl olabilir priceBir niteliği olduğu göz önüne alındığında kısıtlanabilir?

Bu durumda ayrı, genel bir tanım priceType ihtiyaç duyulacaktır; bunu sadece yerel tip tanımlarıyla yapmak mümkün değildir.

Öğe özniteliğe sahipken öğe içeriği nasıl kısıtlanır

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

bir tür oluşturmanız ve bu türün özniteliğini yapmanız gerekir:

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

sonra:

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

Merhaba, Maalesef bu, Fiyat türünü "iki katına" VE "para birimi" özelliğindeki kısıtlama numaralandırmasını aynı anda sınırlamama izin vermiyor
Luke

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

Bu, numaralandırma ihtiyacını tamamen ortadan kaldıracaktır. Gerekirse türü çift olarak değiştirebilirsiniz.


@valuegörünemez xs:attribute. xs:attributeçocuğu olarak görünemez xs:element. Gerekli xs:ad alanı önekleri atlandı. Bu cevap karmakarışık ve silinmesi gerekiyor.
kjhughes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.