在XSD中扩展选择

时间:2014-12-07 02:14:45

标签: xml xsd

我已阅读How to extend a choice complexType without sequencing the choice?XML Schema: Extend xsd:choice so that union (not sequence) of choices is created。我的问题有关但略有不同。我有一个XML Schema,其中包含许多不同的complexTypes,它们都是这样的:

<xs:complexType name="Type_NNN">
    <xs:choice>
        <xs:element name="indiv_NNN" type="Indiv_NNN" minOccurs="0"/>
        <xs:element name="common-element" type="CommmonElement" minOccurs="0"/>
    </xs:choice>
    <xs:attribute name="commonAtt-001" type="xs:string" use="required"/>
    <xs:attribute name="commonAtt-002" type="xs:string" use="optional"/>
    <xs:attribute name="commonAtt-003" type="xs:string" use="optional"/>
    <xs:attribute name="commonAtt-004" type="xs:string" use="optional"/>
    <xs:attribute name="commonAtt-005" type="xs:string" use="optional"/>
    <xs:attribute name="commonAtt-006" type="xs:string" use="optional"/>
    <xs:attribute name="commonAtt-007" type="xs:nonNegativeInteger" 
                  use="optional" default="0"/>
    <xs:attribute name="commonAtt-008" type="xs:string" use="optional"/>
    <xs:attribute name="indivAtt-NNN" type="xs:string" use="optional"/>
</xs:complexType>

也就是说,除了标有“NNN”的项目外,大部分内容都很常见。有没有办法使用继承,以便只需设置一次公共元素?很明显,我可以为属性执行此操作,但<xs:choice>正在绊倒我的元素。是我唯一的选择

        <xs:element name="indiv_NNN" type="Indiv_NNN" minOccurs="0"/>
        <xs:element name="common-element" type="CommmonElement" minOccurs="0"/>

进入<xs:extension>?必须有更好的方法!

2 个答案:

答案 0 :(得分:0)

如果您的主要目标是避免重复自己,最简单的方法可能是使用命名的模型组:

<group name="basic-choice">
  <choice>
    <element name="common-element" 
             type="tns:CommonElement" 
             minOccurs="0"/>
  </
</

共享tns的所有类型:common-element引用此组:

<complexType name="Type_NNN">
  <choice>
    <element name="indiv_NNN" 
             type="tns:Indiv_NNN" 
             minOccurs="0"/>
    <group ref="tns:basic-choice"/>
  </
</

答案 1 :(得分:0)

xs:choice不可扩展。扩展将进入派生类型,扩展内容将进入原始内容之后的单独块。

构建基类型有很好的策略,因此它们非常易于扩展。如果你可以修改基类型,那么使它可扩展的一个好方法就是让它包含一个元素,它应该是一个替换组的头部。然后任何扩展都可以提供一个可替代该头元素的元素。

例如,您可以使用扩展点头构建基本类型:

<complexType name="base_type">
  <sequence>
    <element ref="base_ns:base_extension_point_head" minOccurs="0" maxOccurs="unbounded">
  </sequence>
</complexType>

<element name="base_extension_point_head" abstract="true"/>

然后一个扩展名将替换head元素:

<element name="extension" type="extension_ns:type" substitutionGroup="base_ns:base_extension_point_head"/>

NIEM使用此策略来确保引用模式中的类型是可扩展的。 NIEM称他们为#34;增强点&#34;。有关示例,请参阅the NIEM naming and design rules