2013-04-22 69 views
1

W3Schools网站通过在模式定义开始时定义类型并在稍后在其他complexType中引用这些类型来描述对基本XML模式布局的改进。下面是一个例子:XML Schema中的引用元素

<xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<!-- definition of simple elements --> 
<xs:element name="orderperson" type="xs:string"/> 
<xs:element name="name" type="xs:string"/> 
<xs:element name="address" type="xs:string"/> 
<xs:element name="city" type="xs:string"/> 
<xs:element name="country" type="xs:string"/> 
<xs:element name="title" type="xs:string"/> 
<xs:element name="note" type="xs:string"/> 
<xs:element name="quantity" type="xs:positiveInteger"/> 
<xs:element name="price" type="xs:decimal"/> 

<!-- definition of complex elements --> 
<xs:element name="shipto"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="name"/> 
     <xs:element ref="address"/> 
     <xs:element ref="city"/> 
     <xs:element ref="country"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

我的理解,这通过具有共同的地方定义简单的元素和属性简化了模式的结构。

我的问题是 - 这是不是允许将定义的元素作为顶级元素放置在有效的XML文件中?例如,将下面的代码片段是有效的与问候模式:

<name>Foo</name> 
<name>Bar</name> 
<shipto> 
    <name>...</name> 
    <address>...</address> 
    ... 
</shipto> 

这似乎是无意识的行为,没有真正与定义和引用的模式定义元素的目的。

任何人都可以在处理这种情况的最佳做法上添加任何意见吗?

回答

1

这不是意想不到的行为,其目的。 XSD的理念是,如果

<a><b><c/></b></a> 

是有效的,那么在一般

<b><c/></b> 

也是正确的:在一个有效的文件,每一个片段是有效的。

这可能不是你想要的,但它是XSD设计者想要的。收件人有责任拒绝“我希望文档有效”,但“我希望文档对元素a的声明有效”。 (遗憾的是,一些架构处理器的API实际上并不允许你这样说)。