为什么定义为在架构中'have'命名空间的 xml 元素需要'null-namespace'?



以下 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命名空间"中:<Bar xmlns=""> 。我不明白为什么应该期待一个空命名空间的元素。架构为所有元素定义一个命名空间,对于<Foo> -元素,验证器确实需要f2b -namespace。但是,即使我像上面所做的那样在 <Bar> 元素定义中显式设置命名空间,验证器仍然期望Bar -element xmlns=""。我尝试了架构和文档的几种变体来找到答案,但没有运气 - 我根本无法猜测为什么在这种特殊情况下需要 null 命名空间。

任何提示赞赏...埃克

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

更长的答案:默认情况下,只有顶级"全局"元素声明采用架构的目标命名空间。复杂类型中的"本地"元素声明不在命名空间中。您可以使用 xs:element 标记上的 form 属性对一个特定的本地元素覆盖此设置,也可以对xs:schema上使用 elementFormDefault 的所有元素全局覆盖此设置。

最新更新