【问题标题】:Absense of targetNamespace causing exceptions to schema缺少 targetNamespace 导致架构异常
【发布时间】:2019-06-11 06:44:23
【问题描述】:

我试图了解为什么缺少 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>

【问题讨论】:

    标签: xsd schema


    【解决方案1】:

    这里的问题是:

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

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

    xs:keyref 元素中的 refer 属性是这些 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="..." 行,这样就没有默认命名空间。这样,refer 属性将引用不在命名空间中的 QName,这正是删除 targetNamespace 行时 ChildNamePK 的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      相关资源
      最近更新 更多