2008-10-07 22 views
7

Tôi muốn tạo Lược đồ XML cho đoạn xml này, tôi muốn hạn chế các giá trị thuộc tính "tên", để trong tài liệu đầu ra và chỉ một phiên bản trong ngày được phép cho mỗi ngày trong tuần:Cách xác định nhiều phần tử trong Lược đồ XML có cùng tên và giá trị thuộc tính khác nhau được cho phép?

<a> 
    <day name="monday" /> 
    <day name="tuesday" /> 
    <day name="wednesday" /> 
</a> 

tôi đã cố gắng sử dụng này:

<xs:complexType name="a"> 
    <xs:sequence> 
    <xs:element name="day" minOccurs="1" maxOccurs="1"> 
     <xs:complexType> 
     <xs:attribute name="name" use="required"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="monday" /> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="day" minOccurs="1" maxOccurs="1"> 
     <xs:complexType> 
     <xs:attribute name="name" use="required"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="tuesday" /> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

nhưng XML Schema validator trong eclipse nói lỗi "Nhiều yếu tố có tên 'ngày', với các loại khác nhau, xuất hiện trong các nhóm mô hình.".

Có cách nào khác không?

Trả lời

12

Bạn cần một cái gì đó như thế này:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="day"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="day"> 
    <xs:complexType> 
     <xs:attribute name="name" use="required"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="monday"/> 
       <xs:enumeration value="tuesday"/> 
       <xs:enumeration value="wednesday"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

Jose, điều này đã làm các trick, cảm ơn bạn đã giúp đỡ của bạn. –

+2

Không, điều này không làm các thủ thuật. Nếu mục tiêu là cho phép phần tử một và chỉ một cho mỗi tên ngày, lược đồ này sẽ không làm điều đó. Bạn cần sử dụng xs: unique để quy định chính thức ràng buộc mỗi ngày-ít nhất một lần. – Cheeso

0

Hãy thử điều này:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element maxOccurs="unbounded" name="day"> 
       <xs:complexType> 
        <xs:attribute name="atrib" type="xs:string" use="required" /> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Tôi nghĩ rằng maxOccurs = "vô biên" là những gì bạn cần.

+0

Tôi muốn giới hạn giá trị của thuộc tính, tôi đã làm rõ câu hỏi cho phù hợp. –

0

Bạn đã cân nhắc điều gì đó như thế này chưa? (Tức ngày là một loại, và các yếu tố được đặt tên theo các ngày trong tuần)

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="day" /> 
    <xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="monday" maxOccurs="1" minOccurs="0" type="day" /> 
     <xs:element name="tuesday" maxOccurs="1" minOccurs="0" type="day" /> 
     <xs:element name="wednesday" maxOccurs="1" minOccurs="0" type="day" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

Có, tôi đã làm, thực sự tôi sử dụng chính xác điều này ngay bây giờ, nhưng câu hỏi xml desing dường như với tôi là thích hợp hơn. Dù sao cũng cảm ơn bạn. –

0

Sử dụng lựa chọn thay vì chuỗi

Bằng cách đó cách u chỉ có thể có phần tử của ngày trong phần tử

Và đối với thuộc tính tên, hãy sử dụng thuộc tính ref và tham chiếu nó với điều tra

7

Để đáp ứng ràng buộc nhiều nhất một lần được mô tả trong câu hỏi ban đầu, bạn cần sử dụng phần tử xs:unique trong lược đồ của mình.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified"> 

    <xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="day" maxOccurs="7" minOccurs="1"> 
      <xs:complexType> 
      <xs:attribute name="name" use="required"> 
       <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:pattern value="(mon|tues|wednes|thurs|fri|satur|sun)day"/> 
       </xs:restriction> 
       </xs:simpleType> 
      </xs:attribute> 
      </xs:complexType> 
      <xs:unique name="eachDayAtMostOnce"> 
      <xs:selector xpath="day"/> 
      <xs:field xpath="@name"/> 
      </xs:unique> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 
Các vấn đề liên quan