0

为了简单起见并且因为它们在概念上是相关的,我希望在同一个命名空间中拥有一个文件数组。我有一个主 xsd 或中央 xsd,它将包含其他模式文件,并且基本上用作全局根元素。我的问题最好通过示例来说明,但我基本上无法验证我的非中心模式,这是一个命名空间问题:

模式1(支持):

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://www.company.org" 
            xmlns="http://www.person.org" 
            elementFormDefault="qualified">

    <xsd:simpleType name="test">
        <xsd:restriction base="xsd:string">
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="PersonType">
        <xsd:sequence>
            <xsd:element name="Name" type="test" />
            <xsd:element name="SSN" type="xsd:string" />
        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>

模式 2(中央):

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.company.org"
            xmlns="http://www.company.org"
            elementFormDefault="qualified">

    <xsd:include schemaLocation="http://www.person.org"/>

    <xsd:element name="Company">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Person" type="PersonType"
                             maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

模式 2 很好,模式 1 不验证。“test”没有命名空间,我不知道如何在不破坏我为所有文件使用 1 个命名空间的意图的情况下给它一个命名空间。

4

1 回答 1

0

目前尚不清楚您要问什么问题,所以我猜问题是“为什么架构文档 1 不验证,而架构文档 2 确实验证?”

我无法回答这个问题,因为我无法重现您的结果。您的两个模式文档都会以您提供它们的形式引发错误。

Schema 文档 1在元素(http://www.company.org,Name )的定义中,对于复杂类型(http://www.company.org,PersonType )来说是本地的,指向一个名为(http:// /www.person.org,测试)。但是命名空间http://www.person.org并没有被导入,所以对该命名空间中组件的引用是不合法的。

该规范type="test"被解释为对 ( http://www.person.org , test) 的引用,因为当“test”被解释为 QName 时,它​​的命名空间名称被视为默认命名空间(如果有的话)。这里,默认命名空间(在 xsd:schema 元素上声明)是http://www.person.org

如果——这纯粹是我的猜测——你想引用名称为 ( http://www.company.org , test) 的类型,它在模式文档 1 的第 7-10 行中声明,那么您需要将命名空间前缀绑定到命名空间http://www.company.org并使用该前缀。例如,将 Name 的声明更改为

<xsd:element name="Name" type="tns:test" 
             xmlns:tns="http://www.company.org"/>

或(使用默认命名空间,以避免必须考虑前缀):

<xsd:element name="Name" type="test" 
             xmlns="http://www.company.org"/>

请注意,在第 7-10 行声明的简单类型具有扩展名称(http://www.company.org,test )——我不知道你说“'test'没有命名空间”是什么意思,但是你可能想检查你的假设。

架构文档 2引发错误,因为您在第 6 行的 xsd:include 上指定的架构位置在取消引用时会生成一个不是 XSD 架构文档的文档(它是一个 HTML 页面)。

我希望这有帮助。

于 2013-06-25T16:36:26.687 回答