为什么对于在模式中定义为“拥有”命名空间的xml元素,需要'null-namespace'?

时间:2013-10-08 21:50:59

标签: xml xsd xml-namespaces

以下xml文档和架构是从一个更大的架构中归结而来的,首先出现问题:

xml文档:

<f2b:Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f2b="http://www.outerfoospace.com/schemas/foo2bar" xsi:schemaLocation="http://www.outerfoospace.com/schemas/foo2bar f2b-0-0-0.xsd">
    <f2b:Bar>text</f2b:Bar>
</f2b:Foo>

架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:f2b="http://www.outerfoospace.com/schemas/foo2bar" targetNamespace="http://www.outerfoospace.com/schemas/foo2bar">
    <xs:complexType name="T_Foo">
        <xs:sequence>
            <xs:element name="Bar" xmlns="f2b"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Foo" type="f2b:T_Foo"/>
</xs:schema>

当我针对架构验证文档时,我在<f2b:Bar> - 元素上收到一条错误消息,指出<f2b:Bar>不是预期的。为了使文档有效,我必须将<Bar> - 元素显式(!)放入'null-namespace':<Bar xmlns="">。 我不明白为什么应该期望null-namespaced元素。模式为所有元素定义了名称空间,对于<Foo> - 元素,f2b - 名称空间确实是验证者所期望的。但即使我像上面那样在<Bar> - 元素定义中明确设置了命名空间,验证器仍然期望xmlns="" - 元素的Bar。 我尝试了模式和文档的几个变体来找到没有运气的答案 - 我简直无法猜测为什么在这种特殊情况下会出现空命名空间。

任何暗示都赞赏... ekke

1 个答案:

答案 0 :(得分:3)

简短回答:将elementFormDefault="qualified"添加到架构的根xs:schema标记。

更长的答案:默认情况下,只有顶级“全局”元素声明才会占用架构的目标命名空间。复杂类型中的“局部”元素声明不在命名空间中。您可以使用form标记上的xs:element属性为一个特定的本地元素覆盖此内容,也可以使用elementFormDefaultxs:schema的所有元素全局覆盖此内容。