2009-06-29 84 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