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

时间:2017-08-22 06:51:23

标签: xml xsd

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

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

InnerNode定义位于主文件中,Node位于扩展名中。我的扩展定义如下:

<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文件中我使用Node类型作为更大结构的一部分(它可能使它有点复杂):

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

是否可以这样做?

2 个答案:

答案 0 :(得分:1)

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

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

无论哪种方式,如果其他模式文档的目标名称空间不存在(即它是无命名空间的模式文档),则“type”或“ref”的值必须是无命名空间的QName。这意味着包含元素在范围内不得具有默认命名空间。但你的确如此:xmlns="http://www.additional.org"。因此,您需要通过未声明取消此操作:

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

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

答案 1 :(得分:0)

我进行了一些研究并获得了以下结果:

如果添加主方案elementFormDefault =“unqualified” 同时你将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>

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>