类之间的XSD关系,+层次关系
本文关键字:关系 层次 XSD 之间 | 更新日期: 2023-09-27 17:50:17
我有一些以下格式的xml,其中组状态可以是定义状态中定义的true或false的状态,或者使用另一个具有其值的组。
我如何将xsd用于此关系约束—使用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>
仅靠XSD 1.0无法在这里提供帮助。你当然可以应用Schematron;有一个XSLT 1.0实现可以在。net上工作(因为您指定了c#)。
XSD 1.1内置了对所需内容的支持。然而,XSD 1.1在。NET上的支持很差,因为您要么为。NET购买Saxon的EE,要么使用IKVM将XercesJ"移植"到。NET上(我已经这样做了,它工作了)。在开放环境中,如果让其他人使用XSD 1.1模式,您可能会遇到问题。
如果这是一个新的设计,我可能也会改变一些设计…例如,引用一个组的State
与引用一个定义的State
是不一样的——然后我将为不同的引用类型定义不同的内容模型。我也会放弃ID/IDREF,转而使用key(唯一)/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>