为同一元素定义多种可能性

时间:2011-01-16 03:04:55

标签: xsd

是否可以在XML Schema中根据一个属性定义具有多个不同定义的相同元素。

例如:

<xsd:element name="Element">
  <xsd:complexType>
    <xsd:sequence>
     <xsd:attribute name="type" fixed="type1"/>
    <xsd:seqeuence>
  </xsd:complexType>
</xsd:element>

<xsd:element name="Element">
  <xsd:complexType>
    <xsd:sequence>
     <xsd:attribute name="type" fixed="type2"/>
     <xsd:attribute name="value" type="xsd:integer"/>
    <xsd:seqeuence>
  </xsd:complexType>
</xsd:element>

<xsd:element name="RootElement">
  <xsd:complexType>
    <xsd:sequence>
     <xsd:element ref="Element"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

或者还有其他方法可以解决这个问题。 重要的是两个定义都被命名为“Element”,因为我有一个应用程序需要两个元素以相同的方式命名。但是还有第二个应用需要type2的附加信息。

2 个答案:

答案 0 :(得分:0)

考虑删除type属性,只定义两个具有您希望的不同结构的子节点。

这样你可以拥有

<Element>
  <ElementType1>
    <!--whatever-->
  </ElementType1>
</Element>

<Element>
  <ElementType2 value="42">
    <!--whatever-->
  </ElementType1>
</Element>

在同一份文件中。

Element

的DTD部分中尝试此操作
<!ELEMENT Element (ElementType1?)>  <!-- the ? means 1 or 0 -->
<!ELEMENT Element (ElementType2?)>  

或者更确切地说,如果Element下只允许一个Element而且<!ELEMENT Element (ElementType1 | ElementType1)> 不允许为空:

{{1}}

您可以阅读有关DTD element operators的更多信息。

答案 1 :(得分:0)

如果您使用的是XML Schema 1.1,则可以使用type alternatives。对于XML Schema 1.0,请查看xsi:typeSchematron等附加组件。