XSD元素是如何在XSD:extension模式中组合的



我正在将XSD转换为FrameMaker EDD,但我被XSD:extension机制卡住了。由于W3C对XSD标准的描述非常复杂,我希望这里的XSD专家能给我一个提示。

以下是我的原始XSD中的两个定义:

<xsd:complexType name="basehierarchy">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="num"/>
<xsd:element ref="heading"/>
<xsd:element ref="subheading"/>
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="docContainerType">
<xsd:complexContent>
<xsd:extension base="basehierarchy">
<xsd:choice>
<xsd:element ref="interstitial"/>
<xsd:element ref="toc"/>
<xsd:element ref="documentRef"/>
</xsd:choice>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

在创建EDD(以及附带的DTD(之前,我需要解决扩展,但我不确定上面的模式会产生什么结果。我可以想象各种选择-一种是将扩展的选择注入到基础的选择中:

<xsd:complexType name="docContainerType">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="num"/>
<xsd:element ref="heading"/>
<xsd:element ref="subheading"/>
<xsd:element ref="interstitial"/>
<xsd:element ref="toc"/>
<xsd:element ref="documentRef"/>       
</xsd:choice>
</xsd:complexType>

作为副作用,这将导致@minOccurs和@maxOccurs应用于扩展模式的元素。也许这是可以的,但我找不到关于这方面的明确信息。正确扩展基本模式的另一个选项是在选择基本模式后添加扩展选项:

<xsd:complexType name="docContainerType">
<xsd:sequence>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="num"/>
<xsd:element ref="heading"/>
<xsd:element ref="subheading"/>
</xsd:choice>
<xsd:choice>
<xsd:element ref="interstitial"/>
<xsd:element ref="toc"/>
<xsd:element ref="documentRef"/>       
</xsd:choice>
</xsd:sequence>
</xsd:complexType>

如果第二个选项是正确的,那么扩展应该在基本元素之前还是之后?

也许这个建议可以给你一个线索:XML Schema第0部分:初级第二版,§4.2通过扩展派生类型,尤其是文本的这一部分:

当通过扩展派生复杂类型时,其有效内容模型是基类型的内容模型加上类型派生中指定的内容模型。此外,两个内容模型被视为顺序组的两个孩子

最新更新