XSD 元素替换

  • 定义和使用

    使用 XML 模式,一个元素可以替代另一个元素。!
    假设我们有来自两个不同国家/地区的用户:英格兰和挪威。 我们希望能够让用户选择在 XML 文档中使用挪威元素名称还是英语元素名称。
    为了解决这个问题,我们可以在XML模式中定义一个 replaceGroup。 首先,我们声明一个 head 元素,然后声明其他元素,这些元素声明它们可以替代 head 元素。
    <xs:element name="name" type="xs:string"/>
    <xs:element name="navn" substitutionGroup="name"/>
    在上面的示例中,"name" 元素是 head 元素,而 "navn" 元素可以替代 "name"。
    查看 XML 模式的以下片段:
    <xs:element name="name" type="xs:string"/>
    <xs:element name="navn" substitutionGroup="name"/>
    
    <xs:complexType name="custinfo">
      <xs:sequence>
        <xs:element ref="name"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:element name="customer" type="custinfo"/>
    <xs:element name="kunde" substitutionGroup="customer"/>
    一个有效的 XML 文档(根据上述模式)可能如下所示:
    <customer>
      <name>John Smith</name>
    </customer>
    或像这样:
    <kunde>
      <navn>John Smith</navn>
    </kunde>
  • 阻塞元素替换

    为了防止其他元素替换为指定的元素,请使用 block 属性:
    <xs:element name="name" type="xs:string" block="substitution"/>
    查看 XML 模式的以下片段:
    <xs:element name="name" type="xs:string" block="substitution"/>
    <xs:element name="navn" substitutionGroup="name"/>
    
    <xs:complexType name="custinfo">
      <xs:sequence>
        <xs:element ref="name"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:element name="customer" type="custinfo" block="substitution"/>
    <xs:element name="kunde" substitutionGroup="customer"/>
    一个有效的 XML 文档(根据上述模式)如下所示:
    <customer>
      <name>John Smith</name>
    </customer>
    但此不再有效:
    <kunde>
      <navn>John Smith</navn>
    </kunde>
  • 使用替代组

    可替换元素的类型必须与 head 元素的类型相同或从其派生。 如果可替换元素的类型与 head 元素的类型相同,则无需指定可替换元素的类型。
    注意,替换组中的所有元素(head元素和可替换元素)必须声明为全局元素,否则将不起作用!
  • 什么是全局元素?

    全局元素是 "schema" 元素的直接子元素! 局部元素是嵌套在其他元素中的元素。