我需要编写一个模式(例如,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本身内定义元素时,不会发生此错误。但是,Web上的一些引用表明“ref”属性允许使用外部名称空间前缀。
有人可以指出我的A.xsd架构中的错误是什么吗?或者建议实现我的原始要求,基本上是编写一个使用另一个模式中的元素定义作为嵌套内部元素的模式?
答案 0 :(得分:2)
是的,必须全局定义一个元素,以便在本地定义中@ref
,然后这将允许全局定义的元素作为文档中可能的替代根元素出现。无论您的XSD是通过一个还是多个文件定义,都是如此。
要拥有纯粹的本地元素,请改为定义全局类型,并使用@type
引用共享的全局类型而不是@ref
来引用全局定义的元素。
答案 1 :(得分:1)
假设您已在macAddress
中声明了B.xsd
元素,如下所示::
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:xyz:BNamespace">
<xs:element name="macAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="X"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
您可以在另一个架构(A.xsd)中使用此元素,如下所示:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:BPrefix="urn:xyz:BNamespace">
<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>
</xs:schema>