在XSD中定义元素引用

时间:2010-08-31 03:18:52

标签: xml xsd

如何编写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时,你如何实际处理这个问题?这可以涵盖周期性引用的情况,或者仅仅是为了方便通过使用引用将重复类型的元素重复到最小。

1 个答案:

答案 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"/>

顺便说一句:我认为乘客内部的航班参考将指向其他地方,如果乘客被包含在飞行祖先中,这是多余的。