2012-01-10 59 views
11

Có thể định nghĩa trong Lược đồ XML một điều kiện dựa trên giá trị thuộc tính không? Ví dụ: khi [email protected]="one", tôi muốn one-element được phép và bắt buộc hoặc khi [email protected]="two", tôi muốn two-element được cho phép và bắt buộc.Điều kiện dựa trên giá trị thuộc tính (Lược đồ XML)

Ví dụ, chứng từ hợp lệ là:

<root> 
    <test attrib="one"/> 
    <some-element-1/> 
    <some-element-2/> 
    ... 
    <some-element-n/> 
    <one-element> 
    </one-element> 
</root> 

hoặc

<root> 
    <test attrib="two"/> 
    <some-element-1/> 
    <some-element-2/> 
    ... 
    <some-element-n/> 
    <two-element> 
    </two-element> 
</root> 

tài liệu sai:

<root> 
    <test attrib="one"/> 
    <some-element-1/> 
    <some-element-2/> 
    ... 
    <some-element-n/> 
</root> 

hoặc

<root> 
    <test attrib="two"/> 
    <some-element-1/> 
    <some-element-2/> 
    ... 
    <some-element-n/> 
    <one-element> 
    </one-element> 
</root> 

Có thể trong XSD không?

Trả lời

10

Không cùng loại. Bạn sẽ cần phải xác định một loại khác nhau cho mỗi tùy chọn khác nhau.

CẬP NHẬT

Để tái sử dụng định nghĩa kiểu trong schema của bạn:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://My.Schema.Namespace" 
      targetNamespace="http://My.Schema.Namespace"> 

    <xs:element name="root"> 
    <xs:complexType> 
     <xs:choice> 
     <xs:element name="test1" type="test1Type" /> 
     <xs:element name="test2" type="test2Type" /> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 

    <!-- define the two root types --> 
    <xs:complexType name="test1Type"> 
    <xs:all> 
     <xs:element name="some-element-1" type="some-element-1Type" /> 
     <xs:element name="some-element-2" type="some-element-2Type" /> 
     <xs:element name="some-element-3" type="some-element-3Type" /> 
     <xs:element name="one-element" type="one-elementType" /> 
    </xs:all> 
    <xs:attribute name="attrib" type="xs:string" fixed="one" /> 
    </xs:complexType> 

    <xs:complexType name="test2Type"> 
    <xs:all> 
     <xs:element name="some-element-1" type="some-element-1Type" /> 
     <xs:element name="some-element-2" type="some-element-2Type" /> 
     <xs:element name="some-element-3" type="some-element-3Type" /> 
     <xs:element name="two-element" type="two-elementType" /> 
    </xs:all> 
    <xs:attribute name="attrib" type="xs:string" fixed="two" /> 
    </xs:complexType> 

    <!-- Define re-usable types--> 
    <xs:complexType mixed="true" name="some-element-1Type"/> 
    <xs:complexType mixed="true" name="some-element-2Type"/> 
    <xs:complexType mixed="true" name="some-element-3Type"/> 
    <xs:complexType mixed="true" name="one-elementType"/> 
    <xs:complexType mixed="true" name="two-elementType"/> 

</xs:schema> 

này sẽ xác nhận:

<?xml version="1.0" encoding="utf-8" ?> 
<root xmlns="http://My.Schema.Namespace"> 
    <test1 attrib="one"> 
    <some-element-1>sadas</some-element-1> 
    <some-element-2>sadas</some-element-2> 
    <some-element-3>sadas</some-element-3> 
    <one-element>sadas</one-element> 
    </test1> 
</root> 

<?xml version="1.0" encoding="utf-8" ?> 
<root xmlns="http://My.Schema.Namespace"> 
    <test2 attrib="two"> 
    <some-element-1>sadas</some-element-1> 
    <some-element-2>sadas</some-element-2> 
    <some-element-3>sadas</some-element-3> 
    <two-element>sadas</two-element> 
    </test2> 
</root> 
+0

Vì vậy, tôi cũng cần định nghĩa '' hai lần cho mỗi trường hợp? – Pol

+0

Không, bạn có thể xác định một loại đã biết ở cấp cơ sở lược đồ và tái sử dụng nó. Vui lòng xem cập nhật của tôi. –

+0

Cảm ơn. Để định nghĩa hai kiểu nên tôi sử dụng 'xs: attribute' (với thuộc tính' fixed') và 'xs: choice'? – Pol

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