如何在 xsd 中使用继承来使多个元素成为另一个类型

How do use inheritance in xsd to make multiple elements type of another

我想建模Xml如

.......
<mood1>
   <positive>true</positive>
   <probability>23</probability>
</mood1>
<mood2>
   <positive>false</positive>
   <probability>86</probability>
</mood2>
.........

在 xml 架构中,目前我有

<xs:element name="mood1">
  <xs:complexType>
      <xs:sequence>
          <xs:element ref="category"/>
      </xs:sequence>
</xs:complexType>
<xs:element name="mood2">
  <xs:complexType>
      <xs:sequence>
          <xs:element ref="category"/>
      </xs:sequence>
</xs:complexType>
<xs:element name="category">
<xs:complexType>
  <xs:sequence>
    <xs:element name="positive" type="xs:boolean"/>
    <xs:element name="probability" type="xs:float"/>
  </xs:sequence>
</xs:complexType>

但当然这会为模型添加一个额外的不必要的类别元素,例如

.......
<mood1>
   <category> 
     <positive>true</positive>
     <probability>23</probability>
   </category> 
</mood1>
<mood2>
  <category>
    <positive>false</positive>
    <probability>86</probability>
  </category>
</mood2>
.........

我不想要。

我可以

<xs:element name="mood1">
  <xs:complexType>
      <xs:sequence>
        <xs:element name="positive" type="xs:boolean"/>
        <xs:element name="probability" type="xs:float"/>
      </xs:sequence>
</xs:complexType>
<xs:element name="mood2">
  <xs:complexType>
      <xs:sequence>
        <xs:element name="positive" type="xs:boolean"/>
        <xs:element name="probability" type="xs:float"/>
      </xs:sequence>
</xs:complexType>

但是我不得不继续重复相同的定义(而且不仅仅是 mood1 和 mood2)。

我想说 mood1 是类别的 子类型 但我不知道怎么说,值得注意的是 mood1 和 mood2 确实具有相同的元素,但它们并不相同东西。

找到答案您将公共元素定义为 complexType 然后您的顶级元素通过 type 属性引用 complexType

<xs:complexType name="category">
  <xs:sequence>
    <xs:element name="positive" type="xs:boolean"/>
    <xs:element name="probability" type="xs:float"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="mood1" type="category"/>
<xs:element name="mood2" type="category"/>