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

使用两个模式时xml中的名称空间,xml,xsd,Xml,Xsd,我有一个定义了xml模式的主xsd文件,第二个包含扩展名。我需要这样的东西: <ns:Node> <InnerNode> <Value1>value 1</Value1> <Value2>value 2</Value2> </InnerNode> </ns:Node> 值1 价值2 InnerNode定义位于主文件中,节点位于扩展名1中。我的扩展定

我有一个定义了xml模式的主xsd文件,第二个包含扩展名。我需要这样的东西:

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

值1
价值2
InnerNode定义位于主文件中,节点位于扩展名1中。我的扩展定义如下所示:

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

名称空间在两个模式中都定义了,我为这两个模式都导入了名称空间。当我用示例xml验证模式时,我得到一个错误,即InnerNode也应该有名称空间,而不仅仅是Node元素。我尝试使用带有非限定值的form属性,但没有任何帮助-验证器(XMLSpy)建议插入空的xmlns属性

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

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


值1
价值2

有可能做到这一点吗?

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

如果您在主方案中添加elementFormDefault=“不合格” 同时将form=“unqualified”添加到扩展方案中元素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>

附加.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>

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

或者,如果InnerNode元素的类型在单独的架构文档中定义,则可以使用
name=“InnerNode”type=“InnerNodeType”

无论哪种方式,如果另一个架构文档的目标命名空间不存在(即,它是一个无命名空间架构文档),那么“type”或“ref”的值需要是一个无命名空间的QName。这意味着包含元素的范围中不能有默认命名空间。但您的是:
xmlns=”http://www.additional.org“
。因此,您需要通过取消声明来取消此操作:

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



谢谢您的回复。我尝试了这个方法,但没有解决我的问题-需要xmlns=“”属性才能通过验证。希望我正确理解了这个问题。因此,我创建了两个简单的xsd:主xsd定义InnerNodeType,附加xsd定义Node元素。我从这个xsd中得到了xml。而且看起来您已经使用attchedI无法使用form=“unqualified”属性摆脱xmlns=”“属性。我的情况更复杂,我忘了提到外部结构。请看我对这个问题的编辑。主模式和扩展模式是在同一个名称空间中定义的吗?主xsd:和扩展:有一点技术性:您实际上有一个由两个模式文档组成的模式。但是别担心,没有多少人知道。谢谢你的重播。我已经尝试过了,但我仍然必须在xml中具有xmlns=”“属性。有什么方法可以解决这个问题吗?如果有一个外部元素的名称空间声明形式为
xmlns=“something.else”
,那么在XML实例中只需要
xmlns=“
。因此,在我的例子中,我的XML需要如下所示:值1值2?是吗?不,正如我所说,您不应该在实例中需要
xmlns=“
,除非是取消外部
xmlns=“something.else”
<xsd:element ref="InnerNode" xmlns=""/>
<xsd:element name="InnerNode" form="unqualified" type="InnerNodeType" xmlns=""/>