XSD:如何使用抽象类型的具体实现声明元素?

时间:2011-08-20 13:19:26

标签: xml xsd

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>

请提出解决方案。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,你想要为MessageData定义一个允许它包含AppData子元素的元素声明,前提是AppData的子元素必须是rq3:Doc元素而不是替换组的其他成员(例如rq4:Doc)。这是对的吗?

这有点棘手,因为当你说rq3:Doc可以替代Doc时,这实际上意味着它在任何地方都是可替代的,而不仅仅是在所选位置可替代。您可能最好使用AppData-within-MessageData的本地定义,其类型比全局AppData元素的类型更具限制性。