1

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

在下面的代码片段中,为什么要使用第一种方法而不是第二种方法?

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

A. “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”元素可以使用指定的复杂类型。请注意,子元素“firstname”和“lastname”被指示符包围。这意味着子元素必须以与声明它们相同的顺序出现。您将在 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>

为什么要使用第一种方法而不是第二种方法?

4

2 回答 2

1

局部类型对于不应在某些特定上下文之外重用的元素很有用。例如,表示表格单元格的元素对于用于表格行的类型是本地的,并且对于表行元素的声明对于表示整个表格的元素所使用的类型是本地的,这将是有意义的。(表示表格行的元素 - 在这个帐户上 - 在表格的上下文之外没有任何意义。将声明本地化是确保对其上下文有特殊要求的元素只能在那些上下文。)

XSD 中的本地类型(与其他语言中的本地类型一样)也可以用于避免名称冲突。如果我的词汇表提供了带有称呼的字母salutation,并且还提供了关于人的类似数据库的信息,其中salutation记录了他们的姓名、地址和首选的地址形式(tagged ),那么命名的两个元素salutation很可能被视为彼此完全无关;使它们中的一个或两个成为本地允许它们都存在于词汇表中。(命名空间也可以用于此目的,但我遇到的词汇设计者很少,他们愿意将这两个称呼元素放入不同的命名空间中,甚至更少的 XML 用户会以除了厌恶之外的任何东西来迎接这种前景。)

如果您对防止重用、强调元素对其父元素的语义依赖性或避免名称冲突不感兴趣,那么没有太多理由使用本地元素。(也就是说,很多人确实经常使用它们,也许他们有我不明白的原因。从我所在的位置来看,似乎很多人没有充分的理由过度使用本地声明。)

于 2013-11-12T00:09:30.333 回答
0

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

于 2013-11-11T19:48:22.103 回答