2008-09-19 34 views
18

Tôi đang cố gắng thiết lập một phần của lược đồ giống như "Chuỗi", trong đó tất cả các phần tử con là tùy chọn, nhưng ít nhất một các yếu tố phải có mặt là và có thể có nhiều hơn một trong số chúng.Cấu trúc lược đồ XML cho "bất kỳ một hoặc nhiều thành phần này nhưng phải có ít nhất một"

tôi đã cố gắng làm những điều sau đây, nhưng XMLSpy than phiền rằng "Mô hình nội dung chứa tên phần tử yếu tố < =" DateConstant "> và < element name = "DateConstant" > mà không thể được duy nhất xác định.":

<xs:choice> 
     <xs:sequence> 
      <xs:element name="DateConstant"/> 
      <xs:element name="TimeConstant"/> 
     </xs:sequence> 
     <xs:element name="DateConstant"/> 
     <xs:element name="TimeConstant"/> 
    </xs:choice> 

Điều này có thể được thực hiện (và nếu có, làm thế nào)?

Một số làm rõ: Tôi chỉ muốn cho phép một trong mỗi phần tử có cùng tên. Có thể có một "DateConstant" và/hoặc một "TimeConstant", nhưng không phải là một trong hai. Câu trả lời của Gizmo phù hợp với yêu cầu của tôi, nhưng không thực tế đối với một số lượng lớn các phần tử. Câu trả lời của Hurst cho phép hai hoặc nhiều phần tử cùng tên mà tôi không muốn.

Trả lời

21

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

<xs:choice> 
    <xs:sequence> 
    <xs:element name="Elem1" /> 
    <xs:element name="Elem2" minOccurs="0" /> 
    <xs:element name="Elem3" minOccurs="0" /> 
    </xs:sequence> 
    <xs:sequence> 
    <xs:element name="Elem2" /> 
    <xs:element name="Elem3" minOccurs="0" /> 
    </xs:sequence> 
    <xs:element name="Elem3" /> 
</xs:choice> 

Làm như vậy, bạn buộc một trong hai để lựa chọn phần tử đầu tiên và sau đó là phần còn lại là tùy chọn, hoặc là phần tử thứ hai và phần còn lại là tùy chọn, một trong hai yếu tố thứ ba.

Điều này sẽ làm những gì bạn muốn, tôi hy vọng.

Tất nhiên, bạn có thể đặt các chuỗi phụ thành các nhóm, để tránh trùng lặp một phần tử trong mỗi chuỗi nếu bạn nhận ra bạn đã bỏ lỡ một phần tử.

13

Theo bài báo kỹ thuật trên MSDN tựa đề XML Schema Hiểu tại http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5 bạn có thể tận dụng lợi thế của những hạn chế như minOccurs vào định nghĩa sự lựa chọn (thợ sắp chữ) bản thân:

"Sử dụng chế xuất trên bộ tổng hợp áp dụng cho toàn bộ toàn bộ nhóm "

(Xem ví dụ phức tạp hơn sử dụng các loại phức hợp lồng nhau và ví dụ về loại tác giả)

Bạn đã nêu yêu cầu của mình là "ít nhất một trong các thành phần phải có mặt và có thể có nhiều hơn một phần tử". Vì vậy, tôi đề nghị bạn hãy thử như sau:

<xs:choice minOccurs="1" maxOccurs="unbounded"> 
    <xs:element name="DateConstant" type="..."/> 
    <xs:element name="TimeConstant" type="..."/> 
</xs:choice> 
+0

Điều này không hiệu quả. Nếu một phần tử vắng mặt, trong khi một phần tử là hiện tại, sẽ không có bất kỳ lỗi nào. – yegor256

1

@hurst,

Đáng tiếc là bạn đã thất bại trong việc hiểu câu hỏi ban đầu. Đặt minOccurs = "1" trên lựa chọn được thỏa mãn tự động khi TẤT CẢ các phần tử có minOccurs = "0" được chứa làm tùy chọn.

Vì vậy, bạn đã không giải thích được yêu cầu "ít nhất một" do áp phích gốc, vì không có phần tử nào đáp ứng chính xác 1 lần xuất hiện của hai thành phần hoàn toàn tùy chọn.

Cho đến nay tôi không thể tìm thấy giải pháp cho điều này vì minOccur/maxOccur đều liên quan đến nhóm mà chúng được xác định và KHÔNG liên quan đến tổng số nút.Bạn cũng không thể sử dụng phần tử lựa chọn để xác định cùng một phần tử được đặt tên nhiều lần hoặc nó trở thành "mơ hồ". Tôi đã thấy một số ví dụ sử dụng tài liệu tham khảo thay vì các yếu tố của một loại cụ thể, nhưng tôi tin rằng điều này không phải là trình phân tích XSD microsoft.

<xs:choice minOccurs="1" maxOccurs="1"> 
    <xs:sequence minOccurs="1" maxOccurs="1"> 
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" /> 
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" /> 
    </xs:sequence> 
    <xs:sequence > 
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" /> 
    </xs:sequence> 
</xs:choice> 

Ở đây bạn có thể thấy rằng bạn có chuỗi đầu tiên (phải có Elem1 nhưng có thể có 11m2 tùy chọn) hoặc bạn có chuỗi thứ hai (phải có 11m2).

Do đó, bây giờ bạn có "bất kỳ một hoặc nhiều" trong số 2 yếu tố này. Tất nhiên điều này sẽ phức tạp hơn theo cấp số nhân, bạn càng có nhiều lựa chọn hơn khi bạn cần cung cấp các lựa chọn bổ sung cho tất cả các kết hợp có thể có.

+1

Chỉ là một câu trả lời: Nó không phải là "phức tạp hơn theo cấp số nhân", chỉ có hai chiều. Nhưng nó là cồng kềnh. Tôi ước có điều gì đó dễ dàng hơn. – user3697176

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