Search code examples
xmlxsdxsd-validationxml-validation

XML XSD validation based on parent element?


Is it possible to validate XML node in XSD file "conditionally"? That is, validate it based on parent node name?

For example:

<?xml version="1.0"?>
<rootNode>
  <parentA>
    <value>Some text</value>
  </parentA>
  <parentB>
    <value>Some text</value>
  </parentB>  
</rootNode>

Validation for value used in parentA would look like:

<xs:element name="value">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:maxLength value="10"/>
      <xs:minLength value="0"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

Validation for value used in parentB would be different:

<xs:element name="value">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:maxLength value="4"/>
      <xs:minLength value="0"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

Solution

  • Yes, even in XSD 1.0, locally declared elements can vary in type according to the context provided by the parent element:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="rootNode">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ParentA">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="value">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:maxLength value="10"/>
                        <xs:minLength value="0"/>
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="ParentB">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="value">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:maxLength value="4"/>
                        <xs:minLength value="0"/>
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    The value element within ParentA has a different type than the value element within ParentB.