使用两个模式时xml中的名称空间
我有一个定义了xml模式的主xsd文件,第二个包含扩展名。我需要这样的东西:使用两个模式时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中。我的扩展定
<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=""/>