Сбой проверки XML для атрибутов

У меня возникла проблема с проверкой xml по схеме, которую я определил. Странно то, что проверка не проходит, только если я использую пространство имен по умолчанию xmlns="http://retis.sssup.it/duck-lab", в то время как оно работает как шарм, если я определяю его как xmlns:dl="http://retis.sssup.it/duck-lab".

Когда я использую пустое пространство имен, проверка не выполняется только для атрибутов со следующими сообщениями:

cvc-complex-type.3.2.2: Attribute 'data_len' is not allowed to appear in element 'data'.    
cvc-complex-type.4: Attribute 'data_len' must appear on element 'data'.

ДЕЙСТВИТЕЛЬНЫЙ XML:

<dl:duck xmlns:dl="http://retis.sssup.it/duck-lab" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://retis.sssup.it/duck-lab ../duck.xsd ">
...
        <dl:data dl:data_len="1" dl:data_name="name uint" dl:data_type="uint16" dl:endianess="big-endian"/>

НЕДЕЙСТВИТЕЛЬНЫЙ XML:

<duck xmlns="http://retis.sssup.it/duck-lab" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://retis.sssup.it/duck-lab ../duck.xsd ">
...
    <data data_len="1" data_name="name uint" data_type="uint16" endianess="big-endian"/>

--ИЗМЕНИТЬ--

УТКА.XSD

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://retis.sssup.it/duck-lab"
    xmlns:dl="http://retis.sssup.it/duck-lab" elementFormDefault="qualified">

    <include schemaLocation="datatypes.xsd"/>
    <include schemaLocation="duck_message.xsd"/>

    <complexType name="DuckDefinitionType" block="#all" final="#all">
        <sequence>
            <element type="dl:MessageType" name="message_description" form="qualified"/>
        </sequence>
    </complexType>

    <element name="duck" type="dl:DuckDefinitionType" />

</schema>

ТИПЫ ДАННЫХ.XSD

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://retis.sssup.it/duck-lab"
    xmlns:dl="http://retis.sssup.it/duck-lab" elementFormDefault="qualified">
        <attribute name="data_name" type="string"/>
    <attribute name="data_len" type="nonNegativeInteger"/>
    <attribute name="data_type" type="string"/>
    <attribute name="endianess" type="string"/>
        <element name="data">
        <complexType>
            <attribute ref="dl:data_name" use="required"/>
            <attribute ref="dl:data_len" use="required"/>
            <attribute ref="dl:data_type" use="required"/>
            <attribute ref="dl:endianess" use="required"/>
        </complexType>
    </element>
</schema>

DUCK_MESSAGE.XSD

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://retis.sssup.it/duck-lab"
    xmlns:dl="http://retis.sssup.it/duck-lab" elementFormDefault="qualified">

    <include schemaLocation="datatypes.xsd"></include>
    <complexType name="MessageType">
        <sequence maxOccurs="unbounded">
            <element ref="dl:data"></element>
        </sequence> 
    </complexType>
</schema>

Очевидно, я могу обойти проблему определения непустого пространства имен, но я хотел бы понять, что не так.

Большое спасибо.


person hara    schedule 25.05.2012    source источник
comment
Покажите нам остальную часть схемы (особенно сам элемент schema, так как это может выглядеть как проблема с квалифицированными атрибутами.   -  person Nic Gibson    schedule 25.05.2012
comment
Обновил вопрос с остальной частью схемы.   -  person hara    schedule 25.05.2012


Ответы (1)


Обработка пространства имен по умолчанию отличается для атрибутов: атрибут без префикса пространства имен НЕ связан с пространством имен по умолчанию, у него нет пространства имен, см. здесь.

Это означает, что в недопустимом XML различные атрибуты data-len, data-name и т. д. не имеют пространства имен, тогда как схема объявляет их в пространстве имен http://retis.sssup.it/duck-lab из-за директивы form="qualified".

person MiMo    schedule 25.05.2012