在XML Schema中,有什么方法可以阻止全局元素覆盖本地元素?

时间:2014-06-25 03:33:25

标签: xml types nested schema

当我们定义一个带有类型和本地元素的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的回应编辑。

1 个答案:

答案 0 :(得分:0)

架构中有两个错误。首先,对type =“string”的三个引用应该是type =“xs:string”。其次,您的架构要求本地文档元素具有“id”子元素,该子元素在您的实例中不存在。在修复这些错误时,您的实例将根据您的架构进行验证。

本地元素声明按照您希望的方式工作,我不知道您认为它们不在哪里。

相关问题