Защо 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 е пространството от имена на всички компоненти на схемата в тази схема, както и всички схеми, включени с помощта на включващия елемент

Къде е проблемът: в моето разбиране или в дефиницията на 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