2015-01-29 4 views
0

일반 그래프를 설명하는 EMF 용 ​​스키마를 작성하고 있습니다. 문제는 이것이 directed graph 인 경우 에지는 src_node 및 dst_node의 속성을 가져야하며 그렇지 않은 경우 node_one 및 node_two가 있어야한다는 것입니다. 나는 "선택 사항"을 사용하여 상호 배타적 인 요소를 사용하려고 시도했지만 EMF에서는 "시퀀스"와 동일하게 기능합니다. 예컨대 NodeProperty<choice>은 EMF 용 ​​xsd 스키마를 작성할 때 지원하지 않습니다.

<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> 

답변

0

예. 대체 그룹은 전역 요소에 적용됩니다. 따라서 요소를 유형에서 제외하고 유형에서 해당 요소를 참조하십시오.

<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> 

테스트되지 않음.

아이디어는 지금 node_oneEdge 대신 src_node 사용하는 대신 node_twonode_two 할 수 있다는 것입니다.

대체 가능 유형은 대체 그룹 요소 유형에서 파생되어야합니다. 그래서 예를 들어 anyURI을 사용했습니다. 당신은 아마 그것을 다시하고 싶을 것이다.

그런데 나는 일반적으로 subsition 그룹의 사용을 권장하지 않습니다. XML을 예측할 수 없도록 만듭니다.

+0

감사합니다. 나는 당신의 제안을 따랐고 SubstionGroup은 괜찮습니다. 그러나 EMF는 여전히 src_node 오류를 주장하고 dst_node는 해결되지 않았습니다. 내 질문에 위의 코드를 추가했습니다. @lexicore – Yong

+0

@Yong 네임 스페이스 때문에 어쩌면 말하기가 어렵습니다. – lexicore

+0

감사합니다. 네, 맞습니다. 네임 스페이스 "lib : src_node"를 추가 한 후에 작동하지만 불행하게도 EMF에서는 여전히 src_node 및 dst_node 만 편집기에 표시됩니다. EMF가 substitutionGroup과 "choice"를 지원할 수 있는지 여부를 알고 있습니까? 다시 한 번 감사드립니다! @lexicore – Yong