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>