2012-01-10 166 views
11

是否可以在XML Schema中定義基於屬性值的條件?例如,當[email protected]="one",我想one-element被允許和強制或當[email protected]="two"時,我想要two-element被允許和強制。基於屬性值的條件(XML Schema)

例如,有效證件包括:

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

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

錯誤文件:

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

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

XSD有可能嗎?

回答

10

不在同一類型中。您需要爲每個不同的選項定義不同的類型。

UPDATE

重新使用類型定義架構中的:

<?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> 

這將驗證:

<?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

所以我還需要爲每種情況定義兩次''? – Pol 2012-01-10 10:06:47

+0

不,您可以在架構根級別定義已知類型並重新使用它。請參閱我的更新。 – 2012-01-10 10:20:25

+0

謝謝。爲了定義兩種類型,我應該使用'xs:attribute'(帶有'fixed'屬性)和'xs:choice'? – Pol 2012-01-10 10:29:51