XSD 1.1:属性应该只有另一个属性的值
XSD 1.1: Attribute is supposed to only have values of another attribute
对于我应该设计的纸牌游戏,我的任务是实现一个属性,该属性只能具有其他两个属性可以具有的值。我已经问了一个接近这个问题的问题,在那里我能够限制该属性与另一个属性具有相同的值。但是,当它没有相同的值时,编译器会给出错误消息。
背景:
我有元素“card”,它分为元素“type”(还将“color”定义为属性)和“annotation”,它可以有多个属性,例如“function”和“until”(参见例子):
<card>
<type color="black">One</type>
<annotation function="drawcards">1</annotation>
</card>
有问题的属性是属性“until”,它应该只能有来自属性“color”或“function”的值,它们由枚举决定并且只能有特定的值:
<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>
到目前为止,我能够使用 <xs:assert test="if (@until) then (@until = type/@color) or (@until = annotation/@function) else not (@until)"/>
确定属性“until”
但是-这不允许我给属性“until”赋予另一个值而不是“color”或“function”的值。所以下面的例子是无效的,即使它应该:
<card>
<type color="black">Five</type>
<annotation function="reverse" until="red">1</annotation>
</card>
我需要如何在断言中写入才能使“颜色”或“功能”的任何值也可以具有“直到”的有效值?
好吧,一种方法是列出允许的值:
<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,也不需要断言,因为 until
的允许值(如果我理解正确的话)不依赖于什么在实例的其他地方看到,它们仅取决于模式中的内容。
对于我应该设计的纸牌游戏,我的任务是实现一个属性,该属性只能具有其他两个属性可以具有的值。我已经问了一个接近这个问题的问题,在那里我能够限制该属性与另一个属性具有相同的值。但是,当它没有相同的值时,编译器会给出错误消息。
背景: 我有元素“card”,它分为元素“type”(还将“color”定义为属性)和“annotation”,它可以有多个属性,例如“function”和“until”(参见例子):
<card>
<type color="black">One</type>
<annotation function="drawcards">1</annotation>
</card>
有问题的属性是属性“until”,它应该只能有来自属性“color”或“function”的值,它们由枚举决定并且只能有特定的值:
<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>
到目前为止,我能够使用 <xs:assert test="if (@until) then (@until = type/@color) or (@until = annotation/@function) else not (@until)"/>
确定属性“until”
但是-这不允许我给属性“until”赋予另一个值而不是“color”或“function”的值。所以下面的例子是无效的,即使它应该:
<card>
<type color="black">Five</type>
<annotation function="reverse" until="red">1</annotation>
</card>
我需要如何在断言中写入才能使“颜色”或“功能”的任何值也可以具有“直到”的有效值?
好吧,一种方法是列出允许的值:
<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,也不需要断言,因为 until
的允许值(如果我理解正确的话)不依赖于什么在实例的其他地方看到,它们仅取决于模式中的内容。