XSD 1.0だけでは、ここでは役に立ちません。確かにSchematronを適用できます。.NETで動作するXSLT1.0実装があります(C#を指定したため)。
XSD 1.1には、必要なもののサポートが組み込まれています。ただし、XSD 1.1は、SaxonのEE for NETを購入するか、IKVMを使用して.NETにXercesJを「移植」するため、.NETでは十分にサポートされていません(私はそれを実行しました)。オープンな環境では、他の人がXSD1.1スキーマを使用するのに問題があります。
これが新しいデザインの場合、おそらくデザインの一部も変更します...たとえば、State
グループの参照は定義の参照と同じではありませんState
-次に、さまざまな参照タイプに対してさまざまなコンテンツモデルを定義します。また、key(unique)/keyrefを優先してID/IDREFを削除します。提供された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>