Понятие elementFormDefault квалифицировано/неквалифицировано при проверке xml на WSDL (схема xsd)

Я пытаюсь понять последствия elementFormDefault="qualified/unqualified" в XML-схеме, встроенной в WSDL (SOAP 1.1, WSDL 1).

Например, у меня есть эта схема внутри WSDL:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    targetNamespace="http://www.example.com/library">
    <xsd:element name="person">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="name" type="xsd:string"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

В простом XML это явно недействительно, поскольку "имя" не имеет указанного пространства имен:

<lib:person xmlns:lib="http://www.example.com/library">
    <name>XML Schema</name>
</lib:person>

в то время как это очевидно, потому что все элементы квалифицированы:

<lib:person xmlns:lib="http://www.example.com/library">
    <lib:name>qualified xml</lib:name>
</lib:person>

Но удивительно, что libxml говорит, что справедливо также следующее:

<person xmlns="http://www.example.com/library">
    <name>XML Schema</name>
</person>

Вопрос 1: Я предположил, что qualified означает <person> должен выглядеть примерно как <lib:person xmlns:lib="...">. Но результаты, похоже, указывают на то, что атрибут xmlns делает то же самое?

Предположим, что указанный выше XML является частью запроса SOAP, например

...
<s:Body>
    <person xmlns="http://www.example.com/library">
        <name>XML Schema</name>
    </person>
</s:Body>
...

Вопрос 2: Является ли запрос выше действительным, если WSDL содержит схему qualified, как показано выше? (обычный SOAP, без учета базового профиля WS-I)

Вопрос 3 Когда я рассматриваю базовый профиль WS-I (особенно 4.1.13 SOAP Body and Namespaces), вышеуказанный запрос все еще действителен? (считается ли person "полем имен"?)

Ответы

Ответ 1

Указание "квалифицированного" в схеме, что почти всегда правильно, означает, что объявления локальных элементов (xs: element внутри xs: complexType) относятся к элементам в целевом пространстве имен схемы. Без него они ссылаются на элементы без пространства имен.

Таким образом, с вашим квалифицированным элементом элемент имени должен находиться в пространстве имен http://www.example.com/library. Он будет в этом пространстве имен, если либо

(a) вы явно помещаете его в это пространство имен, как в этом примере:

<lib:person xmlns:lib="http://www.example.com/library">
    <lib:name>qualified xml</lib:name>
</lib:person>

(b) или вы используете пространство имен по умолчанию, как в этом примере:

<person xmlns="http://www.example.com/library">
    <name>qualified xml</name>
</person>