如何创建同构命名空间设计一致的XSD?

时间:2013-06-11 15:04:13

标签: xml xsd xml-namespaces xml-validation xsd-validation

为了简单起见,我希望在同一名称空间中有一个文件数组,因为它们在概念上是相关的。我有一个主要的或中央的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个命名空间的意图的情况下给它。

1 个答案:

答案 0 :(得分:0)

目前尚不清楚你究竟在问什么问题,所以我猜这个问题是“为什么架构文档1没有验证,架构文档2确实验证了?”

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

架构文档1 在元素(http://www.company.org,Name)的定义中,复杂类型(http://www.company.org,PersonType)的本地,指的是名为({ {3}},测试)。但是尚未导入名称空间http://www.person.org,因此对该名称空间中的组件的引用是不合法的。

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

如果 - 这是我个人的纯粹猜测 - 你想引用名称为(http://www.person.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页面)

我希望这会有所帮助。