根据XSD中的其他属性强制验证辅助属性

时间:2016-02-09 17:29:57

标签: xml xsd xml-validation

问题

如果subtype"percent",有没有办法强制basetype成为"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>

1 个答案:

答案 0 :(得分:1)

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>