我有一个主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>
是否可以这样做?
答案 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>