2011-11-04 18 views
1

說,我應該有且僅有一個AnimalElement類型,像這樣一個PetCage元素:XSD:One和某種類型的一個因素應被宣佈

<PetCage> 
    <Cat Name="Kitty"> 
</PetCage> 

<PetCage> 
    <Dog Name="Buddy"> 
</PetCage> 

兩個CatDogAnimanlElement類型。我如何在XSD中表達所述規則?

回答

2

你需要的是在你的模式中的choice element。它可以讓你表達只有一組元素可能出現。

編輯:您需要指定元素的名稱,可以直接通過name或通過ref引用其他地方定義的元素。

你唯一的選擇據我所知是有這樣的事情:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <xs:element name="PetCage"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="animal" type="Animal" minOccurs="1" maxOccurs="1"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="Animal" abstract="true"> 
     <xs:attribute name="Name" type="xs:string" /> 
    </xs:complexType> 

    <xs:complexType name="Cat"> 
     <xs:complexContent> 
      <xs:extension base="Animal"></xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

</xs:schema> 

這將驗證這樣一個形式的XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<PetCage> 
    <animal xsi:type="Cat" Name="String"/> 
</PetCage> 

很不幸,這讓你綁定到那個animal元素名稱。我懷疑XML Schema允許你指定一個特定的類型,並讓你使用通配符作爲名字。 XML Schema基於元素名稱進行驗證,並且如果該元素使用抽象類型定義,則爲xsi:type屬性。有一個xs:any聲明,但不能綁定到任何特定的類型。下面將盡可能地進行驗證,但仍允許使用的圖根目錄下定義的任何元素:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <xs:element name="PetCage"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:any processContents="strict" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="Animal" abstract="true"> 
     <xs:attribute name="Name" type="xs:string" /> 
    </xs:complexType> 

    <xs:element name="cat" /> 
    <xs:complexType name="Cat"> 
     <xs:complexContent> 
      <xs:extension base="Animal"></xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

</xs:schema> 

這將正確地驗證這一點:

<?xml version="1.0" encoding="UTF-8"?> 
<PetCage> 
    <cat Name="snookums"/> 
</PetCage> 

...但它止跌」不要阻止你將PetCage放入PetCage。

我希望能熟悉XML Schema規範的人可以確認這是正確的,或者最好提供所需的解決方案。

+0

正確的,選擇讓我從一組元素,可能會出現的只有一個表達。但是,我不明白如何告訴選擇元素只允許來自同一類型元素的一個元素。 。一個例子會很棒。 – Ian

2
<xs:complexType name="PetCage"> 
    <xs:choice> 
     <xs:element name="Cat" type="AnimanlElement" /> 
     <xs:element name="Dog" type="AnimanlElement" /> 
    </xs:choice> 
</xs:complexType> 
<!-- AnimanlElement definition --> 
<xs:complexType name="AnimanlElement"> 
    <xs:attribute name="Name" type="xs:string" /> 
</xs:complexType> 

更多:http://www.w3schools.com/Schema/el_choice.asp

+0

是否有可能不明確地聲明選擇,只是說「我只需要任何AnimalElement中的一個」? – Ian

+0

@Ian編輯我的答案澄清。我意識到你在發佈之後要求的東西比單純的xs:choice更具體。 –

+0

這可能是一個考慮置換羣體的好地方 –

相關問題