首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >避免targetNamespace导致架构异常

避免targetNamespace导致架构异常
EN

Stack Overflow用户
提问于 2019-06-07 00:23:31
回答 1查看 102关注 0票数 1

我正在尝试理解为什么缺少targetNamespace会导致我的示例XML schema中出现以下错误。如果我删除(targetNamespace="http://tempuri.org/XMLSchema1.xsd"),targetNamespace,我会得到以下错误:

无法在此架构中引用

命名空间'http://tempuri.org/XMLSchema1.xsd‘。XMLSchema1.xsd 30

未声明'http://tempuri.org/XMLSchema1.xsd:ChildNamePK‘标识约束。XMLSchema1.xsd 30

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

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-11 06:44:23

这里的问题是这行:

代码语言:javascript
复制
xmlns="http://tempuri.org/XMLSchema1.xsd"

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

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

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56481608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档