2010-07-24 22 views
30

tôi có mã XSD sau:Xác thực XML với XSD: làm thế nào để tránh quan tâm đến chuỗi các yếu tố?

<xsd:complexType name="questions"> 
    <xsd:sequence> 
     <xsd:element name="location" type="location"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element name="pictureInput" type="pictureInput" minOccurs="0"/> 
    </xsd:sequence> 
</xsd:complexType> 

Vấn đề ở đây là: các yếu tố vị trí, multipleChoiceInput, vv phải xuất hiện theo thứ tự chúng được khai báo. Tôi không muốn điều này xảy ra, tôi muốn điều đó, trong quá trình xác nhận, trình tự không nên có liên quan. Làm thế nào tôi có thể đạt được điều này?

Một khả năng tôi đã cố gắng đã được:

<xsd:complexType name="questions"> 

     <xsd:choice maxOccurs="unbounded"> 
      <xsd:element name="location" type="location"/> 
      <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/> 
      <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/> 
      <xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/> 
     </xsd:choice>    

</xsd:complexType> 

Trong ví dụ này, trình tự thực sự không quan trọng nữa, và tôi có thể có rất nhiều yếu tố như tôi muốn (những gì "tất cả" sẽ không cho phép tôi phải làm). Nhưng tôi vẫn có vấn đề với min- và maxOccurs. Trong ví dụ này, tôi có thể có nhiều "pictureInput" nhất có thể, những hạn chế mà tôi muốn có là 0 hoặc 1.

Cảm ơn bạn rất nhiều vì đã trợ giúp!

Trả lời

39
<xsd:complexType name="questions"> 
    <xsd:all> 
     <xsd:element name="location" type="location"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/> 
     <xsd:element name="textInput" type="textInput"/> 
     <xsd:element name="pictureInput" type="pictureInput"/> 
    </xsd:all> 
</xsd:complexType> 

Chú ý: Tôi đã thay đổi "chuỗi" thành "tất cả"

lực lượng trình tự theo thứ tự (theo quy định). nếu thứ tự không quan trọng thì tất cả đều được sử dụng.

Nếu có nhiều khả năng xảy ra phần tử nhiều lần thì xsd: có thể sử dụng bất kỳ phần tử nào.

<xsd:complexType name="questions"> 
    <xsd:sequence> 
     <xsd:any minOccurs="0"/> 
    </xsd:sequence> 
</xsd:complexType> 

Bạn có thể tìm thông tin chi tiết của xsd: bất kỳ tại liên kết sau:

http://www.w3schools.com/schema/schema_complex_any.asp

+2

Cám ơn trả lời Yok, nhưng "tất cả" không thể được sử dụng trong trường hợp của tôi, nguyên nhân "tất cả" yêu cầu phần tử chỉ xuất hiện ONCE (min- và maxOccurs chỉ có thể chấp nhận các giá trị 0 và 1). – jcborges

+1

Sau đó, có thể '' là bạn của bạn. – Tomalak

+1

Ya trong trường hợp này cần sử dụng bất kỳ. Cũng sẽ cập nhật câu trả lời. – YoK

16

Tôi là một chút muộn để thảo luận này, nhưng tôi đã có cùng một vấn đề và tìm ra giải pháp:

<xsd:complexType name="questions"> 
    <xsd:choice maxOccurs="unbounded"> 
     <xsd:element name="location" type="location"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/> 
     <xsd:element name="textInput" type="textInput"/> 
     <xsd:element name="pictureInput" type="pictureInput"/> 
    </xsd:choice> 
</xsd:complexType> 

Điều quan trọng là kết hợp xs: choice với maxOccurs = "unbounded". Nếu bạn chỉ sử dụng xs: all, bạn được phép sử dụng một trong mỗi khoảng thời gian.

chỉnh sửa để thêm: Trong khi xs: bất kỳ sẽ hoạt động, nó sẽ không giới hạn lựa chọn của bạn cho bốn yếu tố được chia thành từng phần. Nó sẽ cho phép bất cứ điều gì, mà khá nhiều thất bại mục đích của một lược đồ.

+1

Đối với tôi đây là cách tiếp cận tốt nhất cho một vấn đề như vậy mặc dù nó không phải là hoàn hảo. Trong trường hợp này, điều này không tôn trọng yêu cầu có 0 hoặc 1 "pictureInput" s. Bạn có thể thêm nhiều hơn 1 và thiết lập maxOccurs không thể ngăn chặn điều đó (vì bản thân sự lựa chọn là không bị ràng buộc). –

0

Cũng rất muộn để bên đây, nhưng sẽ sử dụng <xsd:all> kết hợp với minOccursmaxOccurs không hoạt động ?:

<xsd:complexType name="questions"> 
    <xsd:all> 
     <xsd:element name="location" type="location" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/> 
    </xsd:all> 
</xsd:complexType> 
+1

Không, bởi vì bên trong của bất kỳ bạn không thể xác định maxOccurs lớn hơn 1 – sotix