2009-06-29 88 views
8

比方說,我想建立一個通用的複雜類型,像這樣:XML架構:爲複雜類型設置默認值?

<xs:complexType name="button"> 
    <xs:sequence> 
     <xs:element name="id" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="href" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="label" type="xs:string" minOccurs="0" maxOccurs="1"/> 
    </xs:sequence> 
</xs:complexType> 

我想引用複雜類型在不同的地方在我的架構文件,如下所示:

<xs:element name="someButton" type="button" /> 

是否有可能我通過someButton元素設置按鈕子元素的默認值? (也就是說,如果我想someButton有「走出去」默認標籤或「index.html的」默認HREF)

基本上...現在我有這樣的事情

<Field Name="State" DataSourceField="State" /> 

和我試圖以儘可能簡單的方式去除冗餘。

回答

18

不,只適用於簡單值。但是,也許你可以使用它們來做你想做的事情,通過爲複雜類型的所有簡單部分提供默認值。但是,對於屬性而言,它比您擁有的元素更好(因爲「缺省屬性值在缺少屬性時應用,並且元素爲空時應用默認元素值」 - 請參見下文)。屬性本身可選默認:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="button" type="button"/> 
    <xs:complexType name="button"> 
    <xs:attribute name="id" type="xs:string"/> 
    <xs:attribute name="href" type="xs:string" default="index.html"/> 
    <xs:attribute name="label" type="xs:string" default="Go"/> 
    </xs:complexType> 
</xs:schema> 

<button id="1"/> 

兩個屬性和元素的默認值使用默認的屬性來聲明,不過這個屬性在每種情況下,稍有不同的結果。當使用默認值聲明屬性時,該屬性的值是在實例文檔中作爲屬性值顯示的任何值;如果該屬性未出現在實例文檔中,則架構處理器將提供該屬性的值等於默認屬性的值。請注意,如果屬性本身是可選的,則屬性的默認值纔有意義,因此指定默認值和除可供使用的值之外的任何值都是錯誤的。

模式處理器對待默認元素的處理略有不同。當一個元素被聲明爲一個默認值時,元素的值就是作爲元素在實例文檔中的內容出現的任何值。如果元素沒有任何內容,模式處理器將爲該元素提供一個與默認屬性相同的值。但是,如果該元素未出現在實例文檔中,則模式處理器根本不提供該元素。總之,元素和屬性默認值之間的差異可以表述爲:缺省屬性值適用於缺少屬性的情況,默認元素值適用於元素爲空時。 [添加強調]

http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints