XSD 严格组合
XSD with strict combination
我对现有 XSD 和我想实施的附加规则有一点疑问。这是我原来的一部分 XSD:
<xs:complexType name="action">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="actid" type="xs:string" use="required" />
<xs:attribute name="acttyp" type="acttype" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="acttype">
<xs:restriction base="xs:string">
<xs:enumeration value="type1" />
<xs:enumeration value="type2" />
<xs:enumeration value="type3" />
<xs:enumeration value="type4" />
</xs:restriction>
</xs:simpleType>
所以你看到有我定义的不同动作类型的动作。现在有一个新规则,如果有一个特殊的actid,让我们取“123”,而不是只允许使用type1。
所以给你看:
<action actid="123" acttype="type1"> = permitted
<action actid="234" acttype="type1"> = permitted
<action actid="234" acttype="type2"> = permitted
<action actid="123" acttype="type2"> = forbidden
有没有办法用 xsd 做到这一点?我不知道如何将枚举与该规则结合起来。有人可以帮帮我吗?
在XSD 1.1中,可以使用xs:assert
.
<xs:assert test="if (@actid = '123') then @acttyp = 'type1' else true()"/>.
您的 XSD 代码应重写如下:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:complexType name="action">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="actid" type="xs:string" use="required"/>
<xs:attribute name="acttyp" type="acttype" use="required"/>
<xs:assert
test="
if (@actid = '123') then
@acttyp = 'type1'
else
true()"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="acttype">
<xs:restriction base="xs:string">
<xs:enumeration value="type1"/>
<xs:enumeration value="type2"/>
<xs:enumeration value="type3"/>
<xs:enumeration value="type4"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="e" type="action"/>
</xs:schema>
我对现有 XSD 和我想实施的附加规则有一点疑问。这是我原来的一部分 XSD:
<xs:complexType name="action">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="actid" type="xs:string" use="required" />
<xs:attribute name="acttyp" type="acttype" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="acttype">
<xs:restriction base="xs:string">
<xs:enumeration value="type1" />
<xs:enumeration value="type2" />
<xs:enumeration value="type3" />
<xs:enumeration value="type4" />
</xs:restriction>
</xs:simpleType>
所以你看到有我定义的不同动作类型的动作。现在有一个新规则,如果有一个特殊的actid,让我们取“123”,而不是只允许使用type1。 所以给你看:
<action actid="123" acttype="type1"> = permitted
<action actid="234" acttype="type1"> = permitted
<action actid="234" acttype="type2"> = permitted
<action actid="123" acttype="type2"> = forbidden
有没有办法用 xsd 做到这一点?我不知道如何将枚举与该规则结合起来。有人可以帮帮我吗?
在XSD 1.1中,可以使用xs:assert
.
<xs:assert test="if (@actid = '123') then @acttyp = 'type1' else true()"/>.
您的 XSD 代码应重写如下:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:complexType name="action">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="actid" type="xs:string" use="required"/>
<xs:attribute name="acttyp" type="acttype" use="required"/>
<xs:assert
test="
if (@actid = '123') then
@acttyp = 'type1'
else
true()"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="acttype">
<xs:restriction base="xs:string">
<xs:enumeration value="type1"/>
<xs:enumeration value="type2"/>
<xs:enumeration value="type3"/>
<xs:enumeration value="type4"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="e" type="action"/>
</xs:schema>