2010-11-05 49 views
2

假设我有一个模式,它在命名空间“general”中定义了一个名为“MyType”的复杂类型。当一个复杂类型被另一个命名空间中的另一个模式引用时,应该使用什么XML命名空间?

然后在另一个模式中使用该复杂类型。

例如:

<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" /> 

应该就是符合该模式使用otherschema或genschema的targetNamespace的XML文档中的XML元素的命名空间。

<general:MyType /> 
or 
<targetNamespacePrefix:Mytype /> 

我在问这个问题,因为我使用Axis2来生成Java代码来与Web服务进行交互。 Axis2代码对名称空间进行了检查,在上面的示例中,它将检查名称空间是否是通用名称,如果不是,则会抛出异常。当然,Web服务响应xml使用targetNamespace而不是常规名称空间,因此每次都会中断。我对Axis2开发人员比Web服务的开发人员更有信心,但是我希望在提交错误报告之前确认我已经写好了。

回答

0

您在“其他”模式中使用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的“otherschema”的名称空间。使用MyType将使用“genschema”命名空间。

我删除了<xsd:element ref="general:MyType"/>,如果MyType是一个元素(不是类型),并且它在类型定义中,这才有意义。假设“otherschema”载:

<xsd:complexType name="otherType> 
    ... 
    <xsd:element ref="general:MyElement"/> 
</xsd:complexType> 

在这种情况下,MyElement仍然会使用“genschema”命名空间中的XML实例文件内。

底线:导入项目不会更改其名称空间。但是,包括它们在内,确实会改变名称空间(即使用<xsd:include>

+0

我已经更新了问题,以便在您的答案中更清楚地从您的示例中明确了解XML文档中符合此要求的元素schema应该用作命名空间,一般是定义复杂类型的地方,或者是使用类型的目标命名空间,我认为它应该是通用的。 – DangerMouse 2011-05-27 16:05:08

相关问题