Xsd 缺少targetNamespace导致架构异常

Xsd 缺少targetNamespace导致架构异常,xsd,schema,Xsd,Schema,我试图理解为什么缺少targetNamespace会导致示例XML模式中出现以下错误。如果删除targetNamespace(targetNamespace=”http://tempuri.org/XMLSchema1.xsd“),我收到以下错误: 命名空间“”不可用 可在本文档中引用 模式。XMLSchema1.xsd30 “”标识 未声明约束。XMLSchema1.xsd30 如果我重新添加targetNamespace,这些错误就会消失,但实际上这是一个来自sql注释模式的示例,为了本文的

我试图理解为什么缺少targetNamespace会导致示例XML模式中出现以下错误。如果删除targetNamespace(targetNamespace=”http://tempuri.org/XMLSchema1.xsd“),我收到以下错误:

命名空间“”不可用 可在本文档中引用 模式。XMLSchema1.xsd30

“”标识 未声明约束。XMLSchema1.xsd30

如果我重新添加targetNamespace,这些错误就会消失,但实际上这是一个来自sql注释模式的示例,为了本文的目的,我将其缩短。因为所有元素都是本地的,所以我想在我的实际模式中删除targetNamespace。如何在不添加targetNamespace的情况下更正模式

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchema1"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Parent">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Child" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Name" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="OldestChild">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Name" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:key name="ChildNamePK">
      <xs:selector xpath=".//Child" />
      <xs:field xpath="Name" />
    </xs:key>
    <xs:keyref name="OldestChildFK" refer="ChildNamePK">
      <xs:selector xpath=".//OldestChild" />
      <xs:field xpath="Name" />
    </xs:keyref>
  </xs:element>
</xs:schema>

这里的问题是:

xmlns=”http://tempuri.org/XMLSchema1.xsd"
这一行表示,任何没有名称空间前缀的QName都应该被视为名称空间是
http://tempuri.org/XMLSchema1.xsd
。这称为默认名称空间

xs:keyref
元素中的
refere
属性是这些qname中的一个,您将其设置为的值是没有名称空间前缀的
ChildNamePK
。因为并没有名称空间前缀,而且您已经定义了默认名称空间,所以XMLSchema有效地将其视为默认名称空间

refer="{http://tempuri.org/XMLSchema1.xsd}ChildNamePK"
i、 e.好像它引用了
http://tempuri.org/XMLSchema1.xsd
名称空间

但是,通过删除
targetNamespace
,您可以说您的元素(包括ChildNamePK键)不在名称空间中。因此,
引用
属性引用的东西实际上并不存在。这就是第二个错误试图告诉您的——它正在查找
http://tempuri.org/XMLSchema1.xsd:ChildNamePK“
但它不存在


这里正确的解决方案可能是删除
xmlns=“…”
行,这样就没有默认名称空间。这样,referer属性将引用不在命名空间中的QName,这正是删除targetNamespace行时ChildNamePK的含义。

这里的问题是行:

xmlns=”http://tempuri.org/XMLSchema1.xsd"
这一行表示,任何没有名称空间前缀的QName都应该被视为名称空间是
http://tempuri.org/XMLSchema1.xsd
。这称为默认名称空间

xs:keyref
元素中的
refere
属性是这些qname中的一个,您将其设置为的值是没有名称空间前缀的
ChildNamePK
。因为并没有名称空间前缀,而且您已经定义了默认名称空间,所以XMLSchema有效地将其视为默认名称空间

refer="{http://tempuri.org/XMLSchema1.xsd}ChildNamePK"
i、 e.好像它引用了
http://tempuri.org/XMLSchema1.xsd
名称空间

但是,通过删除
targetNamespace
,您可以说您的元素(包括ChildNamePK键)不在名称空间中。因此,
引用
属性引用的东西实际上并不存在。这就是第二个错误试图告诉您的——它正在查找
http://tempuri.org/XMLSchema1.xsd:ChildNamePK“
但它不存在

这里正确的解决方案可能是删除
xmlns=“…”
行,这样就没有默认名称空间。这样,referer属性将引用不在命名空间中的QName,这正是删除targetNamespace行时ChildNamePK的含义