Xsd: ограничить атрибут xs: float или ""

Я пытаюсь определить тип элемента в XSD, для которого я хочу необязательный атрибут, который, если присутствует, может содержать float или быть пустым (но все еще присутствует).

Я.е:

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

требуется "исправление", чтобы разрешить все следующие xml: -

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

единственный способ сделать это-изменить тип на xs:string, и использовать xs:restriction С регулярным выражением. Но мне это не кажется идеальным. Есть ли лучший способ?

и Я!--13-->есть чтобы иметь возможность поддерживать эти варианты xml-программы и существующего xml является наследием, и я пытаюсь создать схему, чтобы соответствовать множеству вариантов, которые я вижу в том, что мы должны рассматривать как действительный xml.

3 ответов


Я не думаю, что есть способ справиться с этим и использовать xs:float. Принципиально она сводится к тому, что пустая строка не является допустимым числом. Обычно вы ожидаете значения 0 или полного отсутствия элемента. Есть хорошее объяснение, как ответ на следующий вопрос:

пустые элементы для типов данных primitve запрещены в XSD

Кажется, что вариант использования xs: string и regexp может быть вашим лучшим план.


вы можете определить пользовательский тип для этого, объединив float и пустую строку:

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

или с помощью regExp:

<xs:simpleType name="emptyFloat">
    <xs:restriction base="xs:string">
        <xs:pattern value="-?\d*\.?\d*"/>
    </xs:restriction>
</xs:simpleType>

Если бы вы могли использовать элемент, а не атрибут, вы могли бы сделать xs:float nillable. Таким образом, вы можете использовать xsi:nil="true" в документе экземпляра, чтобы указать, что элемент не имеет значения:

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

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

нет эквивалента для атрибутов.