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