当我们定义一个带有类型和本地元素的W3C XML Schema并且只定义一个全局元素作为根时,看起来该全局元素的名称不能在其他元素中重用,它将始终假定为全局元素的类型,而不是嵌套元素的声明类型。
考虑这个例子:
<document xmlns="myns">
<id>123</id>
<content>
<document>
<text>Lorem Ipsum ...</text>
</document>
</content>
</document>
有两个名为“document”的元素,它们应该具有不同的类型,根元素类型为RootDocument,嵌套文档类型为NestedDocument。以下Schema会说:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="myns" targetNamespace="myns" elementFormDefault="qualified">
<xs:element name="document" type="RootDocument"/>
<xs:complexType name="RootDocument">
<xs:sequence>
<xs:element name="id" type="xs:string"/>
<xs:element name="content" type="Content"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Content">
<xs:sequence>
<xs:element name="document" type="NestedDocument"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="NestedDocument">
<xs:sequence>
<xs:element name="text" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
但问题是,“content”元素中名为“document”的嵌套元素将使用名为“document”的全局元素的Document1类型进行验证,即使每个模式在该点定义了Document2类型。
是否可以通过本地元素定义覆盖全局元素定义?
注意:在此处不能使用嵌套文档元素的不同命名空间。
根据Michael Kay的回应编辑。
答案 0 :(得分:0)
架构中有两个错误。首先,对type =“string”的三个引用应该是type =“xs:string”。其次,您的架构要求本地文档元素具有“id”子元素,该子元素在您的实例中不存在。在修复这些错误时,您的实例将根据您的架构进行验证。
本地元素声明按照您希望的方式工作,我不知道您认为它们不在哪里。