【发布时间】:2015-07-24 16:37:05
【问题描述】:
我需要编写一个模式(比如 A.xsd),它使用为不同项目编写的第二个模式(比如 B.xsd)中的元素。预先存在的模式(即 B.xsd)定义了几个顶级元素。例如:
来自 B.xsd 的片段:
<xs:element name="macAddress">
<xs:complexType>
....
</xs:complexType>
</xs:element>
但是,当我在 A.xsd 中使用 B.xsd 中的这些元素时,它们需要是其他一些元素的内部嵌套元素,而不是像在 B.xsd 中那样的顶级元素。因此,macAddress 和其他元素的 A.xsd 命名空间的简单“导入”似乎对我不起作用,因为导入导致这些元素也成为 A.xsd 的顶级元素。
然后我尝试对 B.xsd 中的顶级元素使用“abstract=true”属性,如下所示:
<xs:element name="macAddress" abstract="true">
<xs:complexType>
....
</xs:complexType>
</xs:element>
然后写A.xsd如下:
<xs:import namespace="urn:xyz:BNamespace"
schemaLocation="file:///C:\Users\a\Documents\B.xsd"/>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element ref="BPrefix:macAddress"/> <!-- BPrefix is defined -->
</xs:sequence>
</xs:complexType>
</xs:element>
但是,此架构随后会在验证期间生成以下错误: “QName {urn:xyz:BNamespace}macAddress 无法解析为 (n) 元素声明。”
我无法理解此错误的含义。请注意,当元素在 A.xsd 本身中定义时,不会发生此错误。但是,网络上的一些参考资料表明“ref”属性允许使用外部命名空间前缀。
有人可以指出我的 A.xsd 架构中的错误是什么吗?或者建议以某种方式实现我的原始要求,这基本上是编写一个使用来自另一个模式的元素定义作为嵌套内部元素的模式?
【问题讨论】: