1

我正在试验< xsd:element > 中的ref属性,但没有得到以下信息:

而带有ref属性的 < xsd:element >可以在非全局范围内定义(即不直接在 < schema > 下方),如下所示:

ref1.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.dummy-example.com"
xmlns:foo="http://www.dummy-example.com">


<xs:element name="a" type ="xs:string"/>

<xs:element name="b">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="foo:a"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

因此,例如以下使用xmllint进行验证:

ref1.xml

<?xml version="1.0"?>
<foo:b xmlns:foo="http://www.dummy-example.com">
    <foo:a>whatever ...</foo:a>
</foo:b>

但是,我不能让引用元素直接位于全局级别。例如以下:

ref2.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.dummy-example.com"
xmlns:foo="http://www.dummy-example.com">
    <xs:element name="a" type ="xs:string"/>
    <xs:element ref="foo:a"/>
</xs:schema>

验证下面的 ref2.xml

ref2.xml

<?xml version="1.0"?>
<foo:a xmlns:foo="http://www.dummy-example.com">
    whatever
 </foo:a>   

事实上xmlint在解析xsd文件的过程中会抱怨,甚至在到达xml文件之前:

ref2.xsd:6: element element: Schemas parser error : Element '{http://www.w3.org/2001/XMLSchema}element': The attribute 'name' is required but missing.

更新

按照接受的答案,我发现XML Schema Primer中阐明的约束:

一个警告是全局声明不能包含引用。全局声明必须直接识别简单和复杂类型。

4

1 回答 1

1

您希望顶级ref声明提供的顶级声明尚未提供给您什么?如果

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.dummy-example.com"
xmlns:foo="http://www.dummy-example.com">
    <xs:element name="a" type ="xs:string"/>
    <xs:element ref="foo:a"/>
</xs:schema>

被允许,它只会说“符合此模式的文档可以具有在命名空间中命名的顶级元素,或者a在命名空间中命名的顶级元素” - 它只会简单地添加任何内容http://www.dummy-example.comahttp://www.dummy-example.com

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.dummy-example.com"
xmlns:foo="http://www.dummy-example.com">
    <xs:element name="a" type ="xs:string"/>
</xs:schema>
于 2013-05-08T14:32:29.767 回答