我正在尝试创建一组模式,并认为将有一个标准模式的核心,然后将使用特定函数导入其他模式,并且可以在单个XML文档中描述整个模式。 / p>
所以,我有SchemaRoot.xsd
,其中包含文档的顶级信息,其中无界序列引用了一个名为SchemaRoot:Component
的根级抽象元素。
<xs:element name="Components">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="Component"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Component" abstract="true">
<xs:attribute name="ServiceID" type="xs:ID" use="required"/>
<!-- I CAN PUT OTHER ATTRIBUTES/SEQUENCES HERE TOO, AND IT VALIDATES -->
</xs:element>
现在在SpecialComponentSetA.xsd
我导入SchemaRoot.xsd
,我创建了一个名为SpecialComponentSetA:SpecialComponentA1
的元素,它是替换组SchemaRoot:Component
的一部分。
<xs:element name="SpecialComponentA1" substitutionGroup="SchemaRoot:Component"/>
在我的文档中,名为DeploymentSetAlpha.xml
导入这两个模式,创建了一个根级别元素,其中包含一个组件SpecialComponentSetA:SpecialComponentA1
,这样可以很好地验证。
<SchemaRoot:Components>
<SpecialComponentSetA:SpecialComponentA1/>
</SchemaRoot:Components>
但是,当我尝试添加任何序列,属性或其他任何内容时,仅仅存在该替换组中的元素:
<xs:element name="SpecialComponentA1" substitutionGroup="SchemaRoot:Component">
<xs:complexType>
<xs:sequence>
<xs:element name="AReallyImportantElement" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
该方案不再有效,我收到e-props-correct.4
错误:
元素&#39; SpecialComponentA1&#39;的{type definition}不能有效地从substituteHead&#39; SchemaRoot:Component&#39;的{type definition}或者&#39; SchemaRoot:Component&#39;的{substitute group exclusions}属性中获得。不允许这种推导。
那么,如何让我的架构进行验证,以便我可以制作包含来自各种XSD架构的结构化数据的有效XML文档?
答案 0 :(得分:0)
抱歉,我很快就找到解决方案,但是:
代表SchemaRoot.xsd
<xs:element name="Components">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="Component"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Component" type="Component" abstract="true"/>
<xs:complexType name="Component" abstract="true">
<xs:attribute name="ServiceID" type="xs:ID" use="required"/>
</xs:complexType>
代表SpecialComponentSetA.xsd
<xs:element name="SpecialComponentA1" substitutionGroup="SchemaRoot:Component">
<xs:complexType>
<xs:complexContent>
<xs:extension base="SchemaRoot:Component">
<xs:sequence>
<xs:element name="AReallyImportantElement" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
然后允许DeploymentSetAlpha.xml
验证
<SchemaRoot:Components>
<SpecialComponentSetA:SpecialComponentA1>
<AReallyImportantElement>FOOBAR</AReallyImportantElement>
</SpecialComponentSetA:SpecialComponentA1>
</SchemaRoot:Components>