1

I am an experienced programmer but just recently took on a job maintaining an app that uses xml schema. They want to add some validation on an item that accepts Longitude. They want to continue to accept a blank and also 0, 0.0000000, or if another value is entered they want to make sure that at the least it is in the United States. (i.e. between -125 and -67)

The current xml schema simply allows any value.

<xs:element name="Location">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="LocLongitude"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

There are multiple venders sending this info in. Here is an example of what they may send:

<Location>
  <LocLongitude xsi:type="xsd:string"></LocLongitude>
</Location>

Now looking at what the users want I found that I can use a union to encapsulate multiple checks. This is what I am using now.

<xs:element name="Location">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="LocLongitude" nillable="true">
        <xs:simpleType>
          <xs:union>
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value=""/>
                <xs:enumeration value="0"/>
              </xs:restriction>
            </xs:simpleType>
            <xs:simpleType>
              <xs:restriction base="xs:double">
                <xs:minInclusive value="0.00000000"/>
                <xs:maxInclusive value="0.00000000"/>
              </xs:restriction>
            </xs:simpleType>
            <xs:simpleType>
              <xs:restriction base="xs:double">
                <xs:minInclusive value="-125"/>
                <xs:maxInclusive value="-67"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:union>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

It validates correctly if I use:

<Location>
  <LocLongitude />
</Location>

Now if I use what the current vendors are using (see below):

<Location>
  <LocLongitude xsi:type="xsd:string"></LocLongitude>
</Location>

We get an error:

THE XSI:TYPE ATTRIBUTE VALUE '' IS NOT VALID FOR THE ELEMENT 'LOCLONGITUDE', EITHER BECAUSE IT IS NOT A TYPE VALIDLY DERIVED FROM THE TYPE IN THE SCHEMA, OR BECAUSE IT HAS XSI:TYPE DERIVATION BLOCKED.

My question is, can I get this to work while still allowing the vendors to include xsi:type="xsd:string"?

JNord
  • 13
  • 3

1 Answers1

0

No, the type chosen for xs:type must be validly derived from the type provided by the associated element. You cannot on the one hand define a type that restricts the value space and on the other hand supports a broader xs:type declaration.

See also: How to restrict the value of an XML element using xsi:type in XSD?

Community
  • 1
  • 1
kjhughes
  • 106,133
  • 27
  • 181
  • 240