单独的 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>