Проверка XML-схемы с помощью xmllint: жалуется на пустые теги, такие как ‹foobar/›

У меня возникла проблема с проверкой XML-файла по схеме XSD с помощью xmllint: xmllint сообщает с ошибкой проверки, что такой тег, как <foobar/>, не ожидается, хотя foobar определен в схеме XSD следующим образом:

<xs:element name="foobar" minOccurs="0">
    <xs:simpleType>
        <xs:restriction base="xs:positiveInteger">
            <xs:minInclusive value="1"/>
            <xs:maxInclusive value="9999"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

Для сравнения:

<foobar>123</foobar> действителен в соответствии с xmlint. xmlint также не жалуется, если я полностью удаляю тег foobar из файла XML.

Вопрос:

Итак, какой смысл отрицать <foobar/>?

Спасибо!

P.S.: Фактическое сообщение об ошибке:

myfile.xml:135298: element foobar: Schemas validity error : Element '{http://www.foobaz.com/namespace}foobar': '' is not a valid value of the local atomic type.

P.P.S.: версия xmlint 20901


person tschlein    schedule 03.03.2016    source источник


Ответы (2)


Вы сказали в своей схеме, что значение элемента должно быть целым числом в диапазоне от 1 до 9999, но фактическое значение элемента — пустое содержимое. Я не совсем понимаю, почему есть вопросы, что ваша схема запрещает это значение.

Если вы хотите разрешить либо целое число в этом диапазоне, либо пустое содержимое, есть два возможных способа сделать это:

(a) определить тип объединения, типы членов которого являются (i) целым числом в диапазоне от 1 до 9999 и (ii) строкой с аспектом length=0, или

(b) определить тип списка, тип элемента которого является целым числом в диапазоне от 1 до 9999, причем тип списка имеет minLength=0, maxLength=1.

Вы также можете использовать nillable="true", но тогда <foobar/> не является допустимым содержанием, это должно быть <foobar xsi:nil="true"/>, что (на мой взгляд) полностью противоречит цели.

person Michael Kay    schedule 03.03.2016

Числовые или нормальные значения могут быть либо целым положительным числом, либо пустой строкой.

ниже возможное решение, в противном случае вы должны использовать nillable="true".

<xs:simpleType name="positive-integer-or-empty">
    <xs:annotation>
        <xs:documentation>The number-or-normal values can be either a positive integer or an empty string. This is used for the content of the ensemble element.</xs:documentation>
    </xs:annotation>
    <xs:union memberTypes="positive-integer-restricted">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value=""/>
            </xs:restriction>
        </xs:simpleType>
    </xs:union>
</xs:simpleType>
<xs:simpleType name="positive-integer-restricted">
    <xs:restriction base="xs:positiveInteger">
        <xs:minInclusive value="1"/>
        <xs:maxInclusive value="9999"/>
    </xs:restriction>
</xs:simpleType>
person Xstian    schedule 03.03.2016