2012-12-31 3 views
1

다음 상태로 정의 상태에 정의 된대로 거짓 상태이거나 값 중 하나와 함께 다른 그룹을 사용할 수있는 다음 형식의 xml이 있습니다.클래스 사이의 XSD 관계, + 계층 관계

이 관계 contsraint에 대해 xsd를 어떻게 사용할 수 있습니까? 정의 및 그룹 이름에 대해 ID와 IDref를 사용하여 해결할 수 있지만 그룹의 값이 실제로 그룹에 정의 된 값인 것은 어떻게 제한합니까?

또한 ID를 구별 할 수있는 방법이 있습니다. 정의를 사용하는 경우 값은 true/false 문자열이어야합니다. 다른 그룹 상태를 사용하는 경우 정의 된 상태 중 하나 여야합니까?

<Definitions> 
    <Definition Name="Name1"/> 
    <Definition Name="Name2" /> 
    </Definitions> 

    <ValueGrps> 
    <Group Name="grp1"> 
     <ComplexState Name="state1"> 
     <State Name="Name1" Value="true" /> 
     <State Name="Name2" Value="true" /> 
     </ComplexState> 
     <ComplexState Name="state2"> 
     <State Name="Name1" Value="false" /> 
     <State Name="Name2" Value="true" /> 
     </ComplexState> 
    </Group> 
    <Group Name="grp2"> 
     <ComplexState Name="state1"> 
     <State Name="grp1" Value="state1" />   
     </ComplexState> 
    </Group>  
    </ValueGrps> 

답변

1

XSD 1.0만으로는 여기에 도움이되지 않습니다. 당신은 확실히 Schematron을 적용 할 수 있습니다; .NET에서 작동하는 XSLT 1.0 구현이 있습니다 (C#을 사용 했으므로).

XSD 1.1은 필요한 것을 지원합니다. 그러나 XSD 1.1은 .NET에서 Saxon의 EE를 사거나 IKVM을 사용하여 .NET에서 XercesJ를 "포팅"하는 것처럼 .NET에서 제대로 지원되지 않습니다. 공개 환경에서 XSD 1.1 스키마를 사용하는 다른 사용자가있을 수있는 문제가 있습니다.

새로운 디자인이라면 디자인의 일부를 바꿀 수도 있습니다 ... 예를 들어 그룹을 참조하는 State은 정의를 참조하는 State과 동일하지 않습니다. 그러면 다른 콘텐츠 모델을 정의 할 것입니다. 다른 참조 유형. 또한 ID/IDREF를 키 (고유)/keyref를 사용하여 삭제합니다. 제공된 XML을 사용할 수있는 예제를 첨부하고 있습니다.

<?xml version="1.0" encoding="utf-8"?> 
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)--> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="root"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Definitions"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element maxOccurs="unbounded" name="Definition"> 
       <xsd:complexType> 
        <xsd:attribute name="Name" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="ValueGrps"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element maxOccurs="unbounded" name="Group"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:element maxOccurs="unbounded" name="ComplexState"> 
         <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element maxOccurs="unbounded" name="State"> 
          <xsd:complexType> 
           <xsd:attribute name="Name" type="xsd:string" use="required" /> 
           <xsd:attribute name="Value" type="xsd:string" use="required" /> 
          </xsd:complexType> 
          </xsd:element> 
         </xsd:sequence> 
         <xsd:attribute name="Name" type="xsd:string" use="required" /> 
         </xsd:complexType> 
        </xsd:element> 
        </xsd:sequence> 
        <xsd:attribute name="Name" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:key name="PK_1"> 
     <xsd:selector xpath="Definitions/Definition|ValueGrps/Group"/> 
     <xsd:field xpath="@Name"/>  
    </xsd:key> 
    <xsd:keyref name="FK_1" refer="PK_1"> 
     <xsd:selector xpath="ValueGrps/Group/ComplexState/State"/> 
     <xsd:field xpath="@Name"/> 
    </xsd:keyref> 
    </xsd:element> 
</xsd:schema>