2012-12-31 92 views
1

我有以下格式的xml,其中組狀態可以是定義狀態中定義的true false狀態,也可以使用具有其中一個值的另一個組。XSD類之間的關係+層次關係

我該如何使用xsd來處理這個關係contsraint - 使用ID和IDref解決了定義和組名的問題,但是如何限制組的值實際上是組中定義的值?

還有什麼辦法來區分ID,以防使用定義的值應該是真/假字符串。如果使用另一個組狀態應該是其定義的狀態之一?

<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 for .NET,或者您使用IKVM在.NET上「移植」XercesJ(我已經完成並運行)。在開放的環境中,您會遇到其他人使用XSD 1.1架構的問題。

如果這是一個新的設計,我可能也會改變一些設計...例如,參考組的State與參考定義的State不同 - 然後我將定義不同的內容模型不同的參考類型。我也會放棄ID/IDREF而選擇key(unique)/ 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>