XSD 无前缀无效

XSD invalid without Prefix

我有导入 types.xsd 的附件 main.xsd。在 XmlSpy(或类似的)中打开它,main.xsd 将正常验证。但是,如果命名空间前缀 ns0 从声明中删除,则它不会生效 - 即使该前缀未在任何地方使用。

好:<xs:schema xmlns:ns0="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data"

差:<xs:schema xmlns="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data"

验证错误信息: "Cannot resolve declaration or definition 'ArrayOfString' in namespace 'http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data'"

谁能解释一下为什么需要前缀?

好文件:GoodMain.xsd 错误文件:BadMain.xsd 导入类型 xsd:Types.xsd

如果命名空间前缀 ns0 没有在任何地方使用,那么您可以安全地删除命名空间声明 xmlns:ns0="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data"

你不能做的是用不同的命名空间声明替换它,xmlns="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data"。这会更改默认名称空间,从而更改架构文档中所有无前缀名称的含义。

更新以响应评论: 更具体地说,如果在模式中声明了默认命名空间 D,则全局声明的元素、类型等 (<element name="x"/>) 将在模式的目标命名空间中,而引用元素或类型的名称(type="x"ref="x")将在命名空间 D 中。除非 D 与目标命名空间相同,否则这往往会产生问题。

(顺便说一下,它不叫 "alias"。如果你使用正确的术语,你会更好地理解。)

通过定义"xmlns=",我是说任何不合格的元素都将属于这个默认命名空间。问题是,因为我没有架构的 "targetNamespace=" 属性,所以默认命名空间所针对的命名空间不存在。

我现在定义 XSD 如下:

<xs:schema targetNamespace="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data" xmlns="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:q2="http://microsoft.com/wsdl/types/" elementFormDefault="unqualified" attributeFormDefault="unqualified">

完整文件在这里:best.xsd