使用两个模式时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>
是它有可能做到这一点?
我已经进行了一些研究,得到了以下结果:
如果添加在你的主方案将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>
如果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=""/>
一个小的技术性:你确实有一个架构由两个模式文档。但别担心,没有多少人知道这一点。 –