我已阅读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>
?必须有更好的方法!
答案 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。