使用两个模式时xml中的命名空间

问题描述:

我有一个xsd文件,定义了xml模式,第二个包含扩展。我需要这样的:使用两个模式时xml中的命名空间

<ns:Node> 
    <InnerNode> 
     <Value1>value 1</Value1> 
     <Value2>value 2</Value2> 
    </InnerNode> 
</ns:Node> 

InnerNode的定义是在主文件中,在扩展名中的节点。我的扩展定义如下所示:

<xs:element name="Node"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="InnerNode" type="InnerNodeType"/> 
     </xs:sequence> 
    </xs:complexType>  
</xs:element> 

命名空间在两种模式中都有定义,我有两种导入。当我使用示例xml验证架构时,出现错误,并且InnerNode应该具有名称空间,而不仅仅是Node元素。我尝试使用带有非限定值的表单属性,但它没有帮助 - 验证器(XMLSpy)建议插入空的xmlns属性。

是否可以定义不需要名称空间(某些缺失属性)的InnerNode元素?

编辑: 我没有提到的是,在主XSD文件我用的是节点类型为更大结构的一部分(这可能使得它更复杂一点):

<OuterNode> <!-- defined in main xsd --> 
    <ns:Node> <!-- defined in imported --> 
     <InnerNode> <!-- defined in main --> 
      <Value1>value 1</Value1> 
      <Value2>value 2</Value2> 
     </InnerNode> 
    </ns:Node>  
</OuterNode> 

是它有可能做到这一点?

+0

一个小的技术性:你确实有一个架构由两个模式文档。但别担心,没有多少人知道这一点。 –

我已经进行了一些研究,得到了以下结果:

如果添加在你的主方案将elementFormDefault =“不合格” ,并在同一时间,你添加的形式=“不合格”到的定义元素InnerNode的扩展方案

<xs:element name="Node"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="InnerNode" form="unqualified" type="InnerNode"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

它会正常工作和验证。

我已附加下面的方案的实例:

main.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.main.org" targetNamespace="http://www.main.org" elementFormDefault="unqualified"> 
    <xsd:complexType name="InnerNodeType"> 
    <xsd:sequence> 
     <xsd:element name="Value1" type="xsd:string"/> 
     <xsd:element name="Value2" type="xsd:string"/> 
    </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

additional.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.additional.org" targetNamespace="http://www.additional.org" 
      xmlns:ext="http://www.main.org" elementFormDefault="qualified"> 
    <xsd:import schemaLocation="main.xsd" namespace="http://www.main.org"/> 
    <xsd:element name="Node"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="InnerNode" type="ext:InnerNodeType" form="unqualified"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

感谢您的回复。 我试过这个,但它不能解决我的问题 - 需要xmlns =“”属性才能通过验证。 – owczarek

+0

希望我正确理解问题。由于我已经创建了两个简单的xsd:主要定义了InnerNodeType,而另一个定义了Node元素。我从这个xsd得到了xml。它看起来像你已经附加 –

+0

我不能使用form =“unqualified”属性摆脱xmlns =“”属性。我的情况更复杂,我忘记提及外部结构。请看我编辑的问题。 – owczarek

如果InnerNode元件中的元件声明中定义在一个单独的模式文档,那么您需要ref="InnerNode"而不是name="InnerNode"。 (使用name =创建一个允许任何内容的本地元素声明)。

替代地,如果InnerNode元素的类型的单独模式文档中被定义,则可以使用name="InnerNode" type="InnerNodeType"

无论哪种方式,如果其他模式文档的目标命名空间不存在(即,它是一个NO-命名空间模式文档),那么“type”或“ref”的值需要是一个无命名空间QName。这意味着包含元素在范围内不能有默认的名称空间。但是你的确如此:xmlns="http://www.additional.org"。因此,你需要用undeclaration取消此:

<xsd:element ref="InnerNode" xmlns=""/> 

<xsd:element name="InnerNode" form="unqualified" type="InnerNodeType" xmlns=""/> 
+0

谢谢您的重播。我试过这个,但我仍然必须在xml中有xmlns =“”属性。有什么办法可以解决这个问题吗? – owczarek

+0

如果存在具有名称空间声明的外部元素,其形式为'xmlns =“something.else”',那么只需要XML实例中的'xmlns =“”'。 –

+0

所以在我的情况下我的XML需要看起来像:值1值2?是对的吗? – owczarek