XSD: ограничить атрибут xs: float или "" - PullRequest
8 голосов
/ 26 июля 2011

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

<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 с регулярным выражением.Но это не кажется мне идеальным.Есть ли лучший способ?

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

Ответы [ 3 ]

5 голосов
/ 14 мая 2015

Вы можете определить пользовательский тип для этого, комбинируя 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>
4 голосов
/ 26 июля 2011

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

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

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

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

1 голос
/ 26 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...