Lược đồ XML Cách hạn chế thuộc tính bằng cách liệt kê


85

Tôi có Thẻ XML sau

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

Làm cách nào để hạn chế thuộc tính tiền tệ ở một trong những điều sau:

  • euro
  • bảng
  • USD

VÀ giá tăng gấp đôi?

Tôi chỉ gặp lỗi khi cố gắng nhập cả hai, đây là những gì tôi gặp phải cho đến nay:

<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
Nếu bạn làm điều này, bạn cũng cần phải xóa type = "xs: string" khỏi phần tử <xs: thuộc tính>. Bạn không thể cung cấp loại khi có loại simpleType hoặc complexType.
Sal

Câu trả lời:


116

Giá trị số dường như bị thiếu trong định nghĩa giá của bạn. Hãy thử những cách sau:

<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
Như được trả lời bởi @kjhughes, <xs:extensionkhông thể trực tiếp là con của <xs:complexTypemà thay vào đó cũng phải được chứa bằng dấu <xs:complexContenthoặc <xs:simpleContent.
HankCa

22

Câu trả lời mới cho câu hỏi cũ

Không có câu trả lời nào cho câu hỏi cũ này giải quyết được vấn đề thực sự.

Vấn đề thực sựxs:complexTypekhông thể trực tiếp cóxs:extensionmột đứa trẻ khi còn nhỏ trong XSD. Cách khắc phục là sử dụngxs:simpleContenttrước. Thông tin chi tiết theo ...


XML của bạn,

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

sẽ có hiệu lực đối với một trong các XSD đã sửa sau đây:

Loại thuộc tính được xác định cục bộ

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

Loại thuộc tính được xác định trên toàn cầu

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

Ghi chú

  • Như nhận xét của @Paul , chúng thay đổi kiểu nội dung pricetừ xs:stringthành xs:decimal, nhưng điều này không hoàn toàn cần thiết và không phải là vấn đề thực sự.
  • Như được trả lời bởi @ user998692 , bạn có thể tách định nghĩa về tiền tệ và bạn có thể thay đổi thành xs:decimal, nhưng đây cũng không phải là vấn đề thực sự.

Vấn đề thực sựxs:complexTypekhông thể có xs:extensionmột đứa trẻ khi còn nhỏ trong XSD; xs:simpleContentlà cần thiết đầu tiên.

Một vấn đề liên quan (không được hỏi nhưng có thể làm nhầm lẫn các câu trả lời khác):

Làm thế nào có thể pricebị hạn chế vì nó có một thuộc tính?

Trong trường hợp này, priceTypesẽ cần một định nghĩa toàn cầu, riêng biệt về ; không thể làm điều này chỉ với các định nghĩa kiểu cục bộ.

Cách hạn chế nội dung phần tử khi phần tử có thuộc tính

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

bạn cần tạo một loại và tạo thuộc tính của loại đó:

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

sau đó:

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

Xin chào, Đáng tiếc là điều này không cho phép tôi giới hạn loại Giá thành "gấp đôi" VÀ liệt kê hạn chế trên thuộc tính "tiền tệ" cùng lúc
Luke

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

Điều này sẽ loại bỏ hoàn toàn nhu cầu liệt kê. Bạn có thể thay đổi loại thành gấp đôi nếu cần.


@valuekhông thể xuất hiện trên xs:attribute. xs:attributekhông thể xuất hiện như một đứa trẻ của xs:element. Các xs:tiền tố không gian tên cần thiết bị bỏ qua. Câu trả lời này là một mớ hỗn độn và chỉ nên được xóa.
kjhughes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.