基于 XSD 中的另一个属性强制验证次要属性

Enforcing validation of a secondary attribute based on another attribute in XSD

问题

如果 basetype"percent",有没有办法强制 subtype 成为 "percent"

我的意思是,如果 basetype"percent"subtype 不是 "percent",验证会失败吗?

XML部分

<quantity name="abc"  basetype="percent" value="2" subtype="percent"/>

XSD 相关部分

          <xs:element name="thing">
            <xs:complexType>
              <xs:attribute name="name" type="xs:string" use="required"/>
              <xs:attribute name="basetype" type="basetype" use="required"/>
              <xs:attribute name="value" type="xs:double" use="required"/>
              <xs:attribute name="subtype" type="subtype" use="required"/>
            </xs:complexType>
          </xs:element>

  <xs:simpleType name="basetype">
    <xs:restriction base="xs:string">
        <xs:enumeration value="fixed"/>
        <xs:enumeration value="percent"/>
    </xs:restriction>
  </xs:simpleType>


  <xs:simpleType name="subtype">
    <xs:restriction base="xs:string">
        <xs:enumeration value="foo"/>
        <xs:enumeration value="percent"/>
        <xs:enumeration value="bar"/>
    </xs:restriction>
  </xs:simpleType>

XSD 1.0

XSD 1.0 不能代表你的约束。

XSD 1.1

XSD 1.1 可以使用 xs:assert:

表示您的约束
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  vc:minVersion="1.1">

  <xs:element name="quantity">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="basetype" type="basetype" use="required"/>
      <xs:attribute name="value" type="xs:double" use="required"/>
      <xs:attribute name="subtype" type="subtype" use="required"/>
      <xs:assert test="(@basetype != 'percent') or (@subtype = 'percent')"/>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="basetype">
    <xs:restriction base="xs:string">
      <xs:enumeration value="fixed"/>
      <xs:enumeration value="percent"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="subtype">
    <xs:restriction base="xs:string">
      <xs:enumeration value="foo"/>
      <xs:enumeration value="percent"/>
      <xs:enumeration value="bar"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>