Почему targetNamespace игнорируется, если элемент не определен на глобальном уровне?

Вот schema.xsd. Он определяет targetNamespace ns, где элемент 'A' включает элемент 'B'.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="ns">
    <xsd:element name="root"/>

    <xsd:element name="A">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="B" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

Вот doc.xml. У него есть узел 'A', который включает в себя узел 'B'. Этот xml действителен в соответствии со схемой.

<root 
    xmlns="ns"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="ns schema.xsd" >

    <A xmlns="ns">
        <B xmlns=""/>
    </A>

</root>

Звучит все нормально... за исключением того, что 'B' не находится в пространстве имен ns!

Согласно msdn, 'B' должно быть в пространстве имен ns.

TargetNamespace — это пространство имен всех схем компонентов в этой схеме, а также любых схем, включенных с помощью элемента include.

Где проблема: в моем понимании или в определении targetNamespace? .


person Joseph Marie    schedule 26.06.2014    source источник


Ответы (1)


B нет в пространстве имен ns, потому что оно повторно объявляет новое пространство имен по умолчанию: нулевое пространство имен. В вашем примере root и A находятся в пространстве имен ns. Объявление xmlns в A не требуется, так как оно наследует пространство имен от root.

В этом примере A, B и root находятся в пространстве имен ns:

<root xmlns="ns"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="ns schema.xsd" >

    <A>
        <B/>
    </A>
</root>

В другом примере B и root находятся в пространстве имен ns, а A — в пространстве имен null:

<root xmlns="ns"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="ns schema.xsd" >

    <A xmlns="">
        <B xmlns="ns"/>
    </A>
</root>
person helderdarocha    schedule 26.06.2014