2010-08-31 191 views
1

如何寫一個xsd來表示下面顯示的xml(取自http://static.springsource.org/spring-ws/sites/2.0/reference/html/why-contract-first.html)?在XSD中定義元素引用

<flight number="KL1117"> 
    <passengers> 
    <passenger> 
     <name>Arjen Poutsma</name> 
     <flight href="KL1117" /> 
    </passenger> 
    </passengers> 
</flight> 

在這種情況下,passenger.flight引用另一個飛行元素(在這種情況下,是乘客的祖父母)。在編寫xsds時如何處理這個問題?這可以涵蓋循環引用的情況,或者僅僅是爲了方便通過使用引用來保持代表複雜類型的元素的重複。

回答

3

除非使用引用全局元素(又名「salami slice」模式)的建模方法,否則沒有問題,因爲您無法定義具有相同名稱的兩個全局元素。如果你使用一個稍微基於類型的方法,這是沒有問題的(請注意,我要離開了爲清楚起見,重複的乘客名單):

<xs:complexType name="FlightDefinition"> 
    <xs:sequence> 
     <xs:element name="passenger" type="Passenger"/> 
    </xs:sequence> 
    <xs:attribute name="number" type="xs:ID" use="required"/> 
</xs:complexType> 
<xs:complexType name="Passenger"> 
    <xs:sequence> 
     <xs:element name="name" type="xs:string"/> 
     <xs:element name="flight" type="FlightReference"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="FlightReference"> 
    <xs:attribute name="href" type="xs:IDREF" use="required"/> 
</xs:complexType> 
<xs:element name="flight" type="FlightDefinition"/> 

順便說一句:我把它裏面的飛行參考乘客將指向其他地方,如果乘客被包含在飛行祖先內,則是多餘的。

+0

這似乎工作 - 我的問題是,我是「薩拉米切片」,並在我的xsd到處使用元素參考。 – whaley 2010-08-31 13:31:14