2010-08-31 194 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