AppData元素包含一个抽象元素Document。
<xs:element name="AppData">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:Document"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Document" type="tns:TDocument" abstract="true"/>
<xs:complexType name="TDocument">
<xs:sequence>
<xs:any namespace="##any" processContents="lax"/>
</xs:sequence>
</xs:complexType>
Document还有两个不同的实例元素:
<xs:element name="Rq3" type="tns:Y" substitutionGroup="smev:Document"/>
<xs:element name="Rq4" type="tns:Z" substitutionGroup="smev:Document"/>
<xs:complexType name="Y">
<xs:complexContent>
<xs:restriction base="smev:TDocument">
<xs:sequence>
<xs:element ref="rq3:Doc"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Z">
<xs:complexContent>
<xs:restriction base="smev:TDocument">
<xs:sequence>
<xs:element ref="rq4:Doc"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
挑战在于定义与Document(Rq3)的具体实例对应的AppData元素的类型:
架构截图:http://i54.tinypic.com/ab74ls.png
如何定义以下xml的类型(包含Rq3的AppData):
<x:MessageData>
<x:AppData>
<rq3:Doc>...</rq3:Doc>
</x:AppData>
</x:MessageData>
请提出解决方案。
答案 0 :(得分:0)
如果我正确理解了这个问题,你想要为MessageData定义一个允许它包含AppData子元素的元素声明,前提是AppData的子元素必须是rq3:Doc元素而不是替换组的其他成员(例如rq4:Doc)。这是对的吗?
这有点棘手,因为当你说rq3:Doc可以替代Doc时,这实际上意味着它在任何地方都是可替代的,而不仅仅是在所选位置可替代。您可能最好使用AppData-within-MessageData的本地定义,其类型比全局AppData元素的类型更具限制性。