假设我有一个模式,它在名称空间"general“中定义了一个名为"MyType”的复杂类型。
然后在另一个模式中,使用该复杂类型。
例如:
<xsd:schema targetNamespace="http://www.example.com/otherschema"
xmlns:general="http://www.example.com/genschema">
<xsd:import namespace="http://www.example.com/genschema" schemaLocation="general.xsd" />
<xsd:element ref="general:Mytype" />
<xsd:element name="myName" type="general:MyType" />
如果XML文档中符合此模式的XML元素上的名称空间使用其他模式或genschema的targetNamespace。
<general:MyType />
or
<targetNamespacePrefix:Mytype />
我之所以问这个问题,是因为我使用Axis2来生成与web服务交互的java代码。Axis2代码对名称空间进行了检查,在上面的示例中,它将检查名称空间是否为通用名称空间,如果不是,则抛出异常。与web服务的开发人员相比,我对Axis2开发人员更有信心,但我希望在提交错误报告之前确保我已经写好了。
发布于 2011-05-20 23:36:49
您在“其他”模式中使用MyType是正确的:声明名称空间,使用import
并使用声明的前缀(general
)。
<xsd:schema targetNamespace="http://www.example.com/otherschema"
xmlns:general="http://www.example.com/genschema">
<xsd:import namespace="http://www.example.com/genschema" schemaLocation="general.xsd" />
<xsd:element name="myName" type="general:MyType" />
</xsd>
请注意,我对http://...
项进行了显式说明,以便清楚哪些项在您所描述的情况下通常是不同的。
如果您询问定义MyType
的模式,请使用无前缀名称作为该模式中的定义:
<xsd:schema targetNamespace="http://www.example.com/genschema"
<xsd:complexType name="MyType"> ... </xsd:complexType>
</xsd:schema>
根据您的编辑进行更新:
在XML实例文档中,使用其他模式的名称空间为“myName
”,即上面的targetNamespace。使用MyType
将使用"genschema“名称空间。
我删除了<xsd:element ref="general:MyType"/>
,只有当MyType
是一个元素(不是类型)并且它在类型定义中时,它才有意义。假设"otherschema“包含:
<xsd:complexType name="otherType>
...
<xsd:element ref="general:MyElement"/>
</xsd:complexType>
在这种情况下,MyElement
仍然在实例文档中使用"genschema“名称空间。
底线:导入项目不会更改它们的名称空间。但是,包含它们确实会更改名称空间(即,使用<xsd:include>
。
https://stackoverflow.com/questions/4106751
复制