使用XML Schema扩展元素而不是complexType

Mar*_*iot 18 xml xsd

假设我有一些架构:

<xsd:schema ...>
    <xsd:element name="foo">
         <xsd:complexType>
             <xsd:sequence>
                 <xsd:element name="fooElement" type="xs:string" />
             </xsd:sequence>
         </xsd:complexType>
    </xsd:element>
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)

这定义了一些元素foo,其中包含一些fooElement带有字符串类型的元素.我现在想扩展元素foo也有一个元素barElement并调用这个扩展名bar.

为了使事情复杂化,我们还假设其他人已定义foo并且架构无法更改.虽然这里的例子很简单,但我们也假设内容foo可能更复杂,定义新模式并不像复制元素那么简单fooElement.

实际上,我想定义一个新架构:

<xsd:schema xmlns:fns="otherschema" ...>
    <xsd:import namespace="otherschema" />
    <xsd:element name="bar">
         <xsd:complexContent>
             <xsd:extension base="fns:foo">
                 <xsd:sequence>
                     <xsd:element name="barElement" type="xs:string" />
                 </xsd:sequence>
             </xsd:extension>
         </xsd:complexContent>
    </xsd:element>
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)

不幸<xsd:extension>的是,该base属性只接受XSD类型参数,而不接受元素.如何扩展元素?(我可以扩展一个元素吗?)

Ben*_*Ben 9

我会创建一个模仿foo元素的新类型,然后从中扩展.虽然它不是最好的解决方案,但您可以获得与直接扩展元素相同的结果.

  <xs:complexType name="fooType">
    <xs:sequence>
      <xs:element name="fooElement" type="xs:string" />
    </xs:sequence>
   </xs:complexType>

   <xs:complexType name="barType">
    <xs:complexContent mixed="false">
      <xs:extension base="fooType">
        <xs:sequence>
          <xs:element name="barElement" type="xs:string" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="bar" type="barType" />
Run Code Online (Sandbox Code Playgroud)