类之间的XSD关系,+层次关系

时间:2012-12-31 07:33:54

标签: c# xml xsd

我有一些xml采用以下格式,其中组状态可以是定义状态中定义的true false状态,也可以使用另一个具有其中一个值的组。

如何将xsd用于此关系contsraint - 使用ID和IDref解决定义和组名称,但如何约束组的值实际上是组中定义的值?

还有任何方法可以区分ID,如果使用定义,则值应为true / false string。如果使用另一个组状态应该是其定义的状态之一吗?

  <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 个答案:

答案 0 :(得分: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不同 - I然后会为不同的参考类型定义不同的内容模型。我也会丢弃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>