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" />
нет эквивалента для атрибутов.