Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XSD: restrict attribute to xs:float or ""

Tags:

xsd

I'm trying to define an element type in XSD, for which i want an optional attribute, which if present can either contain a float, or be empty (but still present).

i.e:

<xs:element name="MyElement">
    <xs:complexType>
        <xs:attribute name="optionalFloatAttribute" type="xs:float" use="optional"/>
    </xs:complexType>
</xs:element>

Needs "fixing" to allow all of the following xml:-

<MyElement/>
 or
 <MyElement optionalFloatAttribute=""/>
 or
 <MyElement optionalFloatAttribute="3.14159"/>

The only way I can see of doing this is to change type to xs:string, and use xs:restriction with a regular expression. But this doesn't seem very ideal to me. Is there a better way?

And I have to be able to support these variations of the xml - the program and existing xml is legacy, and I am trying to back-create a schema to match the myriad variations I see in what we have to regard as valid xml.

like image 308
slippyr4 Avatar asked Jul 26 '11 15:07

slippyr4


2 Answers

You can define custom type for that by combining float and empty string:

<xs:element name="MyElement">
<xs:complexType>
    <xs:attribute name="optionalFloatAttribute" type="emptyFloat" use="optional"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="emptyFloat">
    <xs:union>
        <xs:simpleType>
            <xs:restriction base='xs:string'>
                <xs:length value="0"/>
            </xs:restriction>
        </xs:simpleType>
        <xs:simpleType>
            <xs:restriction base='xs:float'>
            </xs:restriction>
        </xs:simpleType>
    </xs:union>
</xs:simpleType>

Or using regExp:

<xs:simpleType name="emptyFloat">
    <xs:restriction base="xs:string">
        <xs:pattern value="-?\d*\.?\d*"/>
    </xs:restriction>
</xs:simpleType>
like image 124
Victor Avatar answered Nov 23 '22 11:11

Victor


If you could stand using an element rather than an attribute you could make the xs:float nillable. This way you can use the xsi:nil="true" in your instance document to indicate that the element has no value:

<!-- definition -->
<xs:element name="quantity" type="xs:float" nillable="true" />  

<!-- instance -->
<quantity xsi:nil="true" />

No equivalent for attributes though.

like image 42
tom redfern Avatar answered Nov 23 '22 11:11

tom redfern