如何在xsd:sequence之前使用扩展插入?

Eri*_* H. 4 xml xsd

在关于扩展序列的所有示例中,所有新元素都在末尾附加.见personinfofullpersoninfo在: http://www.w3schools.com/schema/schema_complex.asp

如何通过扩展定义新序列以插入新元素?示例(第二部分是错误的;如何纠正?):

<xs:complexType name="address">
  <xs:sequence>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="country" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="fullpersoninfo">
  <xs:complexContent>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
    </xs:sequence>
    <xs:extension base="address"/>
  </xs:complexContent>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

目的是验证一些元素在许多序列的位置citycountry结尾.

示例:

<Employee>
  <name>A.Miller</name>
  <city>Madrid</city>
  <country>Spain</country>
</Employee>
<Flight>
  <airport>CDG</airport>
  <city>Paris</city>
  <country>France</country>
</Flight>
Run Code Online (Sandbox Code Playgroud)

kjh*_*hes 6

正如@Xstian在评论中提到的那样,xs:extension不起作用.详情如下,另有建议......

XSD 1.0

扩展不能序列之前插入新元素; 它们必须在序列之后附加.根据XSD 1.0规范,XML Schema Part 1:Structures Second Edition:

通过在另一个定义的内容模型的末尾添加额外的内容模型粒子,或者通过具有附加的属性声明或两者来实现扩展另一个的复杂类型.

  • 注意:此规范仅允许附加,而不允许其他类型的扩展.此决定简化了将实例从派生类型转换为基类型所需的应用程序处理.未来的版本可能允许更多类型的扩展,需要更复杂的转换来实现转换.

XSD 1.1

支持一些特殊情况,但仍然不允许在搜索序列之前插入序列.根据XSD 1.1规范,W3C XML模式定义语言(XSD)1.1第1部分:结构:

通过在另一个定义的内容模型的末尾添加额外的内容模型粒子,或者通过具有附加的属性声明或两者来实现扩展另一个的复杂类型.

  • 注意:在大多数情况下,此规范仅允许附加,而不允许其他类型的扩展.此决定简化了将实例从派生类型转换为基类型所需的应用程序处理.一个特殊情况允许以不保证新材料仅在内容结尾处出现的方式扩展所有组.另一种特殊情况是通过交错模式中的开放内容进行扩展.

替代建议:团体

而不是xs:extension你可以xs:group用来分解公共元素定义并在它们之前插入新元素.

XML

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <Employee>
    <name>A.Miller</name>
    <city>Madrid</city>
    <country>Spain</country>
  </Employee>
  <Flight>
    <airport>CDG</airport>
    <city>Paris</city>
    <country>France</country>
  </Flight>
</root>
Run Code Online (Sandbox Code Playgroud)

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:group name="AddressGroup">
    <xs:sequence>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:group>

  <xs:complexType name="EmployeeType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:group ref="AddressGroup"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="FlightType">
    <xs:sequence>
      <xs:element name="airport" type="xs:string"/>
      <xs:group ref="AddressGroup"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Employee" type="EmployeeType"/>
        <xs:element name="Flight" type="FlightType"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
Run Code Online (Sandbox Code Playgroud)