2009-03-09 38 views
59

Vấn đề là như sau:Thêm thuộc tính cho một simpleType hoặc hạn chế đến một complexType trong Xml Schema

Tôi có đoạn XML sau:

<time format="minutes">11:60</time> 

Vấn đề là tôi không thể thêm cả thuộc tính và hạn chế cùng một lúc. Định dạng thuộc tính chỉ có thể có giá trị phút, giờ và giây. Hiện có restrictionpattern \d{2}:\d{2}

<xs:element name="time" type="timeType"/> 
... 
<xs:simpleType name="formatType"> 
<xs:restriction base="xs:string"> 
    <xs:enumeration value="minutes"/> 
    <xs:enumeration value="hours"/> 
    <xs:enumeration value="seconds"/> 
</xs:restriction> 
</xs:simpleType> 
<xs:complexType name="timeType"> 
    <xs:attribute name="format"> 
     <xs:simpleType> 
      <xs:restriction base="formatType"/> 
     </xs:simpleType> 
    </xs:attribute> 
</xs:complexType> 

Nếu tôi thực hiện một loại phức tạp của timeType, tôi có thể thêm một thuộc tính, nhưng không phải là hạn chế, và nếu tôi thực hiện một kiểu đơn giản, tôi có thể thêm những hạn chế nhưng không phải là thuộc tính . Có cách nào để giải quyết vấn đề này không. Đây không phải là một hạn chế rất lạ, hay là nó?

Trả lời

110

Để thêm thuộc tính bạn phải lấy được theo tiện ích mở rộng, để thêm các khía cạnh bạn phải lấy được do hạn chế. Do đó, việc này phải được thực hiện theo hai bước cho nội dung con của phần tử. Các thuộc tính có thể được định nghĩa inline:

<xsd:simpleType name="timeValueType"> 
    <xsd:restriction base="xsd:token"> 
    <xsd:pattern value="\d{2}:\d{2}"/> 
    </xsd:restriction> 
</xsd:simpleType> 

<xsd:complexType name="timeType"> 
    <xsd:simpleContent> 
    <xsd:extension base="timeValueType"> 
     <xsd:attribute name="format"> 
     <xsd:simpleType> 
      <xsd:restriction base="xsd:token"> 
      <xsd:enumeration value="seconds"/> 
      <xsd:enumeration value="minutes"/> 
      <xsd:enumeration value="hours"/> 
      </xsd:restriction> 
     </xsd:simpleType> 
     </xsd:attribute> 
    </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 
+0

Cảm ơn bạn rất nhiều! – t1gor

1

Tôi muốn đề xuất ví dụ của tôi với lời giải thích chi tiết hơn những gì thực sự cần để pha trộn lên kiểu di truyền với những hạn chế trong khi thêm thuộc tính.

đây là nơi bạn xác định loại được kế thừa của bạn (trong trường hợp của tôi là xs: string dựa trên một với chiều dài trường là 1024 hạn chế được áp dụng). bạn không thể có loại này làm loại chuẩn cho trường của mình vì bạn cũng sẽ thêm "thuộc tính" vào trường của mình.

<xs:simpleType name="string1024Type"> 
    <xs:restriction base="xs:string"> 
     <xs:maxLength value="1024"/> 
    </xs:restriction> 
    </xs:simpleType> 

này là nơi mà yếu tố của bạn được xác định dựa trên loại tin của bạn (trong trường hợp của tôi đó là "string1024Type") và thuộc tính cần thiết nối:

<xs:element maxOccurs="unbounded" name="event"> 
    <xs:complexType> 
    <xs:simpleContent> 
     <xs:extension base="string1024Type"> 
     <xs:attribute default="list" name="node" type="xs:string"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

cả hai khối có thể là ở những nơi hoàn toàn tách biệt lược đồ của bạn. điểm quan trọng chỉ sau một lần nữa - bạn không thể kết hợp thừa kế và phân bổ trong cùng một định nghĩa phần tử.

Các vấn đề liên quan