ycomp
ycomp

Reputation: 8583

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

Question

Is there a way to enforce subtype to be "percent" if basetype is "percent"?

I mean, have validation fail if basetype is "percent" but subtype isn't "percent"?

XML partial

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

XSD pertinent sections

          <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>

Upvotes: 1

Views: 111

Answers (1)

kjhughes
kjhughes

Reputation: 111716

XSD 1.0

XSD 1.0 cannot represent your constraint.

XSD 1.1

XSD 1.1 can represent your constraint using 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>

Upvotes: 1

Related Questions