代码之家  ›  专栏  ›  技术社区  ›  whaley

在XSD中定义元素引用

  •  1
  • whaley  · 技术社区  · 14 年前

    如何编写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>
    

    在这种情况下,旅客.航班正在引用另一个航班元素(在本例中,是乘客的祖父母)。在编写xsd时,您实际如何处理这个问题?这可以涵盖循环引用的情况,或者只是为了方便起见,通过使用引用将表示复杂类型的元素的重复保持在最低限度。

    1 回复  |  直到 14 年前
        1
  •  3
  •   xcut    14 年前

    除非您使用引用全局元素(又称“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"/>
    

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