XSD 1.1:断言属性值是否包含在枚举中

XSD 1.1: Assert if value of attribute is contained in enum

我有元素 Config,它包含 3 个属性:设备、名称和值。

    <Config device="phone" name="id" value="1111" />

根据@name 的值,我想验证属性@value 是字符串、整数还是布尔值。我使用 xs:alternative 创建了模式,允许根据属性更改元素类型。

<xs:element name="Config" type="configType">
    <xs:alternative type="configInt" test="@name = ('id','port')" />
    <xs:alternative type="configString" test="@name = ('deviceUdid','company')" />
    <xs:alternative type="configBoolean" test="@name = ('isRunning','isStopped')" />
</xs:element>
<!-- Base for Config -->
<xs:complexType name="configType">
    <xs:attribute name="device" type="devices" />
</xs:complexType>

<!-- Alternative for int -->
<xs:complexType name="configInt">
    <xs:complexContent>
        <xs:extension base="configType">
            <xs:attribute name="name" type="configIntList" />
            <xs:attribute name="value" type="xs:int" />
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<!-- Alternative for string-->
<xs:complexType name="configString">
    <xs:complexContent>
        <xs:extension base="configType">
            <xs:attribute name="name" type="configStringList" />
            <xs:attribute name="value" type="xs:string" />
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<!-- Alternative for boolean -->
<xs:complexType name="configBoolean">
    <xs:complexContent>
        <xs:extension base="configType">
            <xs:attribute name="name" type="configBooleanList" />
            <xs:attribute name="value" type="xs:boolean" />
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

对于每个配置:configBoolean、configInt 和 configString,我有属性“name”的可能值的枚举。

<xs:simpleType name="configStringList">
  <xs:restriction base="xs:string">
    <xs:enumeration value="deviceUdid" />
    <xs:enumeration value="company" />
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="configIntList">
  <xs:restriction base="xs:string">
    <xs:enumeration value="id" />
    <xs:enumeration value="port" />
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="configBooleanList">
  <xs:restriction base="xs:string">
    <xs:enumeration value="isRunning" />
    <xs:enumeration value="isStopped" />
  </xs:restriction>
</xs:simpleType>

我的问题是 - 我能否在 xs:alternative 中使用此枚举进行测试,而不是列出 @name 属性的所有可能值?我想完成这样的事情:

<xs:element name="Config" type="configType">
        <xs:alternative type="configInt" test="@name = configIntList" />
        <xs:alternative type="configString" test="@name = configStringList" />
        <xs:alternative type="configBoolean" test="@name = configBooleanList" />
</xs:element>

虽然 XPath 2 及更高版本允许 expressions/checks 类似于 @name castable as ns1:configIntList,即允许您检查例如name 属性可以转换为某种类型,例如 configIntList 类型,我认为这对您的用例没有帮助;似乎 XPath 2 子集允许检查类型替代品非常受限,只允许使用 built-in 类型,因此您无权访问正在处理的模式中的类型。