Xml XSD 1.1:属性应该只包含另一个属性的值
对于我应该设计的纸牌游戏,我的任务是实现一个属性,该属性只能具有其他两个属性可以具有的值。我已经问了一个与此相近的问题,我可以限制该属性与另一个属性具有相同的值。但是,当它的值不相同时,编译器会发出错误消息 背景: 我有元素“card”,它分为元素“type”(它也定义了一个“color”作为属性)和“annotation”,可以有几个属性,例如“function”和“until”(参见示例):Xml XSD 1.1:属性应该只包含另一个属性的值,xml,xsd,attributes,restriction,Xml,Xsd,Attributes,Restriction,对于我应该设计的纸牌游戏,我的任务是实现一个属性,该属性只能具有其他两个属性可以具有的值。我已经问了一个与此相近的问题,我可以限制该属性与另一个属性具有相同的值。但是,当它的值不相同时,编译器会发出错误消息 背景: 我有元素“card”,它分为元素“type”(它也定义了一个“color”作为属性)和“annotation”,可以有几个属性,例如“function”和“until”(参见示例): 一个 1. 所讨论的属性是“直到”属性,该属性只能具有属性“颜色”或“函数”中的值,这些属性由枚
一个
1.
所讨论的属性是“直到”属性,该属性只能具有属性“颜色”或“函数”中的值,这些属性由枚举确定,并且只能具有某些值:
<xs:simpleType name="color">
<xs:restriction base="xs:string">
<xs:enumeration value="black"/>
<xs:enumeration value="red"/>
<xs:enumeration value="blue"/>
<xs:enumeration value="green"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="function">
<xs:restriction base="xs:string">
<xs:enumeration value="drawcards"/>
<xs:enumeration value="cancel_turn"/>
<xs:enumeration value="reverse"/>
<xs:enumeration value="throwcards"/>
</xs:restriction>
</xs:simpleType>
到目前为止,我能够通过使用
然而,这不允许我给属性“直到”赋予比“颜色”或“函数”更大的值。因此,以下示例无效,即使它应该:
<card>
<type color="black">Five</type>
<annotation function="reverse" until="red">1</annotation>
</card>
五
1.
我需要如何在断言中写入,以使“color”或“function”也可以具有“until”的有效值。好的,一种方法是列出允许的值:
<xs:simpleType name="until">
<xs:restriction base="xs:string">
<xs:enumeration value="black"/>
<xs:enumeration value="red"/>
<xs:enumeration value="blue"/>
<xs:enumeration value="green"/>
<xs:enumeration value="drawcards"/>
<xs:enumeration value="cancel_turn"/>
<xs:enumeration value="reverse"/>
<xs:enumeration value="throwcards"/>
</xs:restriction>
</xs:simpleType>
但是,当然,您希望避免重复列表,因此您真正想要做的是定义一个允许其他两种类型允许的任何内容的类型。您可以通过工会来实现这一点:
<xs:simpleType name="until">
<xs:union memberTypes="color function"/>
</xs:simpleType>
这不需要XSD 1.1,也不需要断言,因为
直到
的允许值(如果我理解正确的话)不依赖于实例中其他地方看到的内容,它们只依赖于模式中的内容。这最终完全解决了我的问题。我一直在寻找一种不必重复列表就可以使用相同值的方法,所以使用xs:union就成功了。非常感谢你!
<xs:simpleType name="until">
<xs:union memberTypes="color function"/>
</xs:simpleType>