<choice> 为 EMF 编写 xsd 架构时不支持

<choice> not support when writing xsd schema for EMF

我正在为 EMF 编写一个模式来描述一般图形。问题是,如果这是有向图,那么边应该具有 src_node 和 dst_node 的属性,否则它具有 node_one 和 node_two 的属性。我尝试使用 "choice" 来获得互斥元素,但在 EMF 中它的功能与 "sequence" 相同。例如 NodeProperty

的类似问题
    <xsd:complexType name="NodeProperty">
            <xsd:choice>
                  <xsd:element name="StringValue" type="xsd:string"/>
                  <xsd:element name="IntValue" type="xsd:int"/>
                  <xsd:element name="DoubleValue"  type="xsd:double"/>
            </xsd:choice>
            <xsd:attribute name="Property" type="xsd:string"/>
    </xsd:complexType>

substitutionGroup 中的另一个问题是 src_node 和 dst_node 声称未被 EMF 解决。完整代码:

<?xml version="1.0" encoding="UTF-8"?>

<xsd:simpleType name="GraphType">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="Directed"/>
        <xsd:enumeration value="Undirected"/>
    </xsd:restriction>
</xsd:simpleType>

    <xsd:complexType name="NodeProperty">
            <xsd:choice>
                  <xsd:element name="StringValue" type="xsd:string"/>
                  <xsd:element name="IntValue" type="xsd:int"/>
                  <xsd:element name="DoubleValue"  type="xsd:double"/>
            </xsd:choice>
            <xsd:attribute name="Property" type="xsd:string"/>
    </xsd:complexType>

<xsd:complexType name="Node">
            <xsd:sequence>
          <xsd:element maxOccurs="unbounded" minOccurs="0"
                    name="Node" type="lib:NodeProperty"/>
            </xsd:sequence>
            <xsd:attribute name="NodeName" type="xsd:string" />
</xsd:complexType>

    <xsd:element name="src_node" type="xsd:anyURI" ecore:reference="lib:Node"/>
    <xsd:element name="node_one" type="xsd:anyURI" substitutionGroup="src_node"/>
    <xsd:element name="dst_node" type="xsd:anyURI" ecore:reference="lib:Node"/>
    <xsd:element name="node_two" type="xsd:anyURI" substitutionGroup="dst_node"/>

    <xsd:complexType name="Edge">
    <xsd:sequence>
            <xsd:element ref="src_node"/>
            <xsd:element ref="dst_node"/>
    </xsd:sequence>
    </xsd:complexType>

<xsd:complexType name="GeneralGraph">
    <xsd:sequence>
        <xsd:element name="name" type="xsd:string"/>
        <xsd:element name="type" type="lib:GraphType"/>
        <xsd:element name="NodeList">
                            <xsd:complexType>
                                    <xsd:sequence>
                              <xsd:element maxOccurs="unbounded" minOccurs="0"
                                    name="Node" type="lib:Node"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>                                                                                                                                                                          
        <xsd:element name="EdgeList">
                            <xsd:complexType>
                                    <xsd:sequence>
                              <xsd:element maxOccurs="unbounded" minOccurs="0"
                                    name="Edge" type="lib:Edge"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>                                                                                                                                                                          
    </xsd:sequence>
</xsd:complexType>

是的。替换组适用于全局元素。因此,将您的元素移出您的类型并在类型中引用它们。

<xsd:element name="src_node" type="xsd:anyURI" ecore:reference="lib:Node"/>
<xsd:element name="node_one" type="xsd:anyURI" substitutionGroup="src_node"/>
<xsd:element name="dst_node" type="xsd:anyURI" ecore:reference="lib:Node"/>
<xsd:element name="node_two" type="xsd:anyURI" substitutionGroup="dst_node"/>


<xsd:complexType name="Edge">
        <xsd:sequence>
                <xsd:element ref="src_node"/>
                <xsd:element ref="dst_node"/>
        </xsd:sequence>
</xsd:complexType>

未测试。

想法是,现在可以在 Edge 中使用 node_one 代替 src_nodenode_two 代替 node_two

请注意,可替换项的类型必须派生自替换组元素的类型。所以我使用 anyURI 只是为了举例。您可能需要对其进行返工。

顺便说一下,我通常不鼓励使用替换组。让你的 XML 变得不可预测。