我想从ER-Model创建一个新的XML Schema。 我有以下模型。
[Type1]--(1:M)--->(doSomething)<---(0:N)--[Type2]
属性:
[Type1]: ID1 ,文字
[Type2]: ID2 ,文字
现在我想为该模型创建一个XML Schema。我已经创建了一个Schema,但我认为我没有正确的关系(1:M)和(0:N)。
有谁能解释我如何实现正确的关系?
这是我目前的XML Schema。
<xs:element name="XMLModel">
<xs:complexType>
<xs:sequence>
<xs:element name="MyType1" type="type1" maxOccurs="unbounded">
<xs:key name="MyType1_ID">
<xs:selector xpath="MyType1"/>
<xs:field xpath="ID1"/>
</xs:key>
</xs:element>
<xs:element name="MyType2" type="type2" maxOccurs="unbounded">
<xs:key name="MyType2_ID">
<xs:selector xpath="MyType2"/>
<xs:field xpath="ID2"/>
</xs:key>
</xs:element>
<xs:element name="DoSomething" type="typeDo" maxOccurs="unbounded">
<xs:keyref name="Ref1" refer="MyType1_ID">
<xs:selector xpath="DoSomething"/>
<xs:field xpath="child::MyType1"/>
</xs:keyref>
<xs:keyref name="Ref2" refer="MyType2_ID">
<xs:selector xpath="DoSomething"/>
<xs:field xpath="child::MyType2"/>
</xs:keyref>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="type1">
<xs:sequence>
<xs:element name="Text" type="xs:string"/>
<xs:element name="ID1" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="type2">
<xs:sequence>
<xs:element name="Text" type="xs:string"/>
<xs:element name="ID2" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="typeDo">
<xs:all>
<xs:element name="MyType1" type="xs:integer"/>
<xs:element name="MyType2" type="xs:integer"/>
</xs:all>
</xs:complexType>
答案 0 :(得分:0)
您的实体模型是多对多关系,但XML文档本质上是一个层次结构。您可以使用XML层次结构建模一对多关系中的一个,使用主键/外键建模另一个关系,或者您可以使用主键和外键对这两种关系进行建模 - 这是您显然正在尝试做的事情。
你做错了是将键和keyrefs定义在错误的级别:它们都需要在容器级别(XMLModel)。如果你想说T中的每个R都有一个F的唯一值,那么键需要在R的级别定义,选择器应该从T中选择R,并且该字段应该从R中选择F.