缺少targetNamespace导致架构异常

时间:2019-06-06 16:23:31

标签: xsd schema

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

  

命名空间'http://tempuri.org/XMLSchema1.xsd'不是   可在此引用   模式。 XMLSchema1.xsd 30

     

http://tempuri.org/XMLSchema1.xsd:ChildNamePK”标识   没有声明约束。 XMLSchema1.xsd 30

如果我重新添加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>

1 个答案:

答案 0 :(得分:0)

这里的问题是线:

xmlns="http://tempuri.org/XMLSchema1.xsd"

此行说,任何没有名称空间前缀的QName都应被视为名称空间为http://tempuri.org/XMLSchema1.xsd。这称为默认名称空间。

refer元素中的xs:keyref属性是这些QName之一,您将其设置为的值是ChildNamePK,它没有名称空间前缀。由于没有名称空间前缀,并且已经定义了默认名称空间,因此XML模式将有效地将其视为已存在

refer="{http://tempuri.org/XMLSchema1.xsd}ChildNamePK"

即就像它引用了http://tempuri.org/XMLSchema1.xsd名称空间中的ChildNamePK元素一样。

但是,通过删除targetNamespace,您是说您的元素(包括ChildNamePK键)不在命名空间中。因此refer属性引用的东西并不存在。这就是第二个错误试图告诉您的内容-它正在寻找http://tempuri.org/XMLSchema1.xsd:ChildNamePK',但它不存在。

正确的解决方案可能是删除xmlns="..."行,以便没有默认名称空间。这样,referer属性将引用不在名称空间中的QName,这恰恰是删除targetNamespace行时的ChildNamePK。