XML Schema วิธี จำกัด แอตทริบิวต์โดยการแจงนับ


86

ฉันมีแท็ก XML ต่อไปนี้

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

ฉันจะ จำกัด แอตทริบิวต์สกุลเงินเป็นหนึ่งต่อไปนี้ได้อย่างไร:

  • ยูโร
  • ปอนด์
  • ดอลลาร์

และราคาเป็นสองเท่า?

ฉันเพิ่งได้รับข้อผิดพลาดเมื่อพยายามพิมพ์ทั้งสองอย่างนี่คือสิ่งที่ฉันได้รับจนถึงตอนนี้:

<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
หากคุณทำเช่นนี้คุณจะต้องลบ type = "xs: string" ออกจากองค์ประกอบ <xs: attribute> ด้วย คุณไม่สามารถระบุประเภทได้เมื่อมี simpleType หรือ complexType
Sal

คำตอบ:


117

ค่าตัวเลขดูเหมือนจะหายไปจากนิยามราคาของคุณ ลองทำดังต่อไปนี้:

<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 <xs:extensionไม่สามารถเป็นลูกของโดยตรงได้<xs:complexTypeแต่จะต้องมี<xs:complexContentหรือ<xs:simpleContentอยู่ด้วย
HankCa

22

คำตอบใหม่สำหรับคำถามเก่า

ไม่มีคำตอบใดที่มีอยู่สำหรับคำถามเก่านี้ที่ช่วยแก้ปัญหาที่แท้จริง

ปัญหาที่แท้จริงคือxs:complexTypeไม่สามารถมีxs:extensionบุตรใน XSD ได้โดยตรง การแก้ไขคือต้องใช้xs:simpleContentก่อน รายละเอียดตาม ...


XML ของคุณ

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

จะถูกต้องกับอย่างใดอย่างหนึ่งของ XSDs การแก้ไขดังต่อไปนี้:

ประเภทแอตทริบิวต์ที่กำหนดภายในเครื่อง

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

ประเภทแอตทริบิวต์ที่กำหนดโดยส่วนกลาง

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

หมายเหตุ

  • ตามความเห็นของ @Paulสิ่งเหล่านี้จะเปลี่ยนประเภทเนื้อหา priceจากxs:stringเป็นxs:decimalแต่สิ่งนี้ไม่จำเป็นอย่างยิ่งและไม่ใช่ปัญหาที่แท้จริง
  • ตามคำตอบของ @ user998692คุณสามารถแยกความหมายของสกุลเงินออกและคุณสามารถเปลี่ยนเป็นxs:decimalได้ แต่นี่ก็ไม่ใช่ปัญหาที่แท้จริงเช่นกัน

ปัญหาที่แท้จริงคือxs:complexTypeไม่สามารถมีxs:extensionบุตรใน XSD ได้โดยตรง xs:simpleContentเป็นสิ่งจำเป็นก่อน

เรื่องที่เกี่ยวข้อง (ไม่ได้ถาม แต่อาจมีคำตอบอื่นที่สับสน):

จะpriceถูก จำกัด ได้อย่างไรเนื่องจากมีแอตทริบิวต์?

ในกรณีนี้priceTypeจำเป็นต้องมีคำจำกัดความสากลที่แยกจากกัน เป็นไปไม่ได้ที่จะทำสิ่งนี้ด้วยคำจำกัดความประเภทโลคัลเท่านั้น

วิธี จำกัด เนื้อหาองค์ประกอบเมื่อองค์ประกอบมีแอตทริบิวต์

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

คุณต้องสร้างประเภทและสร้างแอตทริบิวต์ของประเภทนั้น:

<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:complexType>
    <xs:attribute name="currency" type="curr"/>
</xs:complexType>

สวัสดีน่าเศร้าที่นี่ไม่อนุญาตให้ฉัน จำกัด ประเภทราคาเป็น "สองเท่า" และการระบุข้อ จำกัด ในแอตทริบิวต์ "currency" ในเวลาเดียวกัน
ลุค

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

สิ่งนี้จะขจัดความจำเป็นในการแจงนับโดยสิ้นเชิง คุณสามารถเปลี่ยนประเภทเป็นสองเท่าได้หากจำเป็น


@valuexs:attributeไม่สามารถปรากฏบน ไม่สามารถปรากฏเป็นลูกของxs:attribute คำนำหน้าเนมสเปซที่xs:elementจำเป็นxs:จะถูกละไว้ คำตอบนี้ไม่เป็นระเบียบและควรลบทิ้ง
kjhughes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.