何时应该通过直接命名元素来声明复杂类型,而不是使用type属性?

时间:2013-11-11 19:27:15

标签: xsd

http://www.w3schools.com/schema/schema_complex.asp

在接下来的snippit中,为什么第一种方式应该在第二种方式中使用?

  

我们可以通过两种不同的方式在XML Schema中定义复杂元素:

     

一个。可以通过命名元素直接声明“employee”元素,如下所示:

<xs:element name="employee">   
 <xs:complexType>
  <xs:sequence>
   <xs:element name="firstname" type="xs:string"/>
   <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>   
 </xs:complexType> 
</xs:element>
  

如果使用上述方法,则只能使用“employee”元素   使用指定的复杂类型。注意子元素,   “名字”和“姓氏”被包围着   指示符。这意味着子元素必须出现在同一个元素中   订单,因为他们被宣布。您将了解有关指标的更多信息   XSD指标章节。

     

B中。 “employee”元素可以具有type属性,该属性引用要使用的复杂类型的名称:

<xs:complexType name="personinfo">   
 <xs:sequence>
  <xs:element name="firstname" type="xs:string"/>
  <xs:element name="lastname" type="xs:string"/>  
 </xs:sequence>
</xs:complexType>
  

如果您使用上述方法,可以参考几个元素   相同的复杂类型,如下:

<xs:element name="employee" type="personinfo"/> 
<xs:element name="student" type="personinfo"/>
<xs:element name="member" type="personinfo"/>

<xs:complexType name="personinfo">  
 <xs:sequence>
  <xs:element name="firstname" type="xs:string"/>
  <xs:element name="lastname" type="xs:string"/>   
 </xs:sequence> 
</xs:complexType>

为什么第一种方式应该在第二种方式上使用?

2 个答案:

答案 0 :(得分:1)

本地类型对于不应在某些特定上下文之外重用的元素非常有用。例如,表示表格单元格的元素对于表格行使用的类型是本地的,并且表格行元素的声明对于用于表示整个表格的元素的类型是本地的,这是有意义的。 (表示行表的元素不会 - 在此帐户上 - 在表的上下文之外有任何意义。使声明本地化是一种简单的方法,可确保对其上下文有特殊要求的元素只能用于那些上下文。)

XSD中的本地类型(也可以像其他语言中的本地类型一样)在避免名称冲突方面也很有用。如果我的词汇表提供了标记为salutation的称呼,并且还提供了有关其姓名,地址和首选地址形式(标记为salutation)的人员的类似数据库的信息,名为salutation的两个要素可能被视为完全无关;使其中一个或两个本地允许它们都存在于词汇表中。 (命名空间也可以用于此目的,但我遇到了一些词汇设计师,他们希望将这两个称呼元素放入不同的命名空间,甚至更少的XML用户会用任何东西来讨论这个前景,而不是厌恶。)

如果您对防止重用,强调元素在其父级上的语义依赖性或避免名称冲突不感兴趣,那么使用本地元素的理由就不多了。 (也就是说,很多人确实使用它们很多,也许他们有理由我不理解。从我坐的地方看,似乎很多人都没有充分的理由过度使用当地的声明。)

答案 1 :(得分:0)

某些GUI XSD编辑器仅支持直接声明复杂类型,但如果您希望能够重用复杂类型,则通常可以手动创建类型。 因此,在这种情况下,如果只重复使用类型,我只会声明可重用的复杂类型,因为它更容易不声明可重用的复杂类型。