微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XSD 1.1:属性应该只有另一个属性的值

如何解决XSD 1.1:属性应该只有另一个属性的值

对于我应该设计的纸牌游戏,我的任务是实现一个属性,该属性只能具有其他两个属性可以具有的值。我已经问了一个接近这个问题的问题,在那里我能够限制该属性与另一个属性具有相同的值。但是,当它具有不同的值时,编译器会给出错误消息。

背景: 我有元素“card”,它分为元素“type”(它还定义了“color”作为属性)和“annotation”,它可以有几个属性,例如“function”和“until”(参见示例):

<card>
   <type color="black">One</type>
   <annotation function="drawcards">1</annotation>
</card> 

有问题的属性属性“直到”,它应该只能从属性“颜色”或“功能”中获得值,这些值由枚举确定并且只能具有某些值:

    <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)"/> 来确定属性“直到” 但是 - 这不允许我为属性“直到”赋予另一个值而不是“颜色”或“功能”的值。所以下面的例子是无效的,即使它应该:

    <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 的允许值(如果我理解正确的话)不依赖于在实例中其他地方看到的内容,它们只取决于架构中的内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。