2013-04-22 53 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實際上並不允許你這樣說)。