如何编写xsd来表示下面显示的xml(取自http://static.springsource.org/spring-ws/sites/2.0/reference/html/why-contract-first.html)?
<flight number="KL1117">
<passengers>
<passenger>
<name>Arjen Poutsma</name>
<flight href="KL1117" />
</passenger>
</passengers>
</flight>
在这种情况下,passenger.flight正在引用另一个飞行元素(在这种情况下,乘客的祖父母)。在编写xsds时,你如何实际处理这个问题?这可以涵盖周期性引用的情况,或者仅仅是为了方便通过使用引用将重复类型的元素重复到最小。
答案 0 :(得分:3)
除非您使用建模方法来引用全局元素(也称为“萨拉米香蕉切片”模式),否则没有问题,因为您无法定义具有相同名称的两个全局元素。如果您使用稍微更基于类型的方法,这是没有问题的(请注意,为了清楚起见,我将遗漏重复的乘客列表):
<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"/>
顺便说一句:我认为乘客内部的航班参考将指向其他地方,如果乘客被包含在飞行祖先中,这是多余的。