我有一个xsd文件,我宁愿不修改(Exceptions.xsd):
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://me.com/Exceptions.xsd"
targetNamespace="http://me.com/Exceptions.xsd"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
>
<xs:element name="Exception" type="ExceptionType" />
<xs:complexType name="ExceptionType">
<xs:sequence>
<xs:element name="Code" type="xs:string" minOccurs="0"/>
<xs:element name="Message" type="xs:string"/>
<xs:element name="TimeStamp" type="xs:dateTime"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
我想创建一个新元素,其他名称实现ExceptionType(ExceptionsExtensions.xsd - Alternative 1)。
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://me.com/Exceptions.xsd"
targetNamespace="http://me.com/Exceptions.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"
http://me.com/Exceptions.xsd Exceptions.xsd
"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="SpecificException" type="ExceptionType" />
</xs:schema>
我收到错误消息:未声明类型“http://me.com/Exceptions.xsd:ExceptionType”。
但是,如果我这样做(ExceptionExtensions.xsd - Alternative 2):
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://me.com/Exceptions.xsd"
targetNamespace="http://me.com/Exceptions.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"
http://me.com/Exceptions.xsd Exceptions.xsd
"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="SpecificException">
<xs:complexType>
<xs:sequence>
<xs:element name="innerException">
<xs:complexType>
<xs:sequence>
<xs:any namespace="http://me.com/Exceptions.xsd" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
我可以验证
<?xml version="1.0" encoding="utf-8"?>
<SpecificException xmlns="http://me.com/Exceptions.xsd">
<innerException>
<Exception>
<Code>12</Code>
<Message>Message</Message>
<TimeStamp>2009-08-27T11:30:00</TimeStamp>
</Exception>
</innerException>
</SpecificException>
因此在备选方案1中,它找不到在Exceptions.xsd中声明的ExceptionType,但在备选方案2中,它可以找到在Exceptions.xsd中声明的Exception-element。
为什么备选方案1不起作用?
亲切的问候, Guillaume Hanique
答案 0 :(得分:3)
在“备选方案1”中,您引用了“ExceptionType” - 但它未在该文件中的任何位置声明。
仅仅因为两个文件共享相同的命名空间并不意味着文件A可以依赖于文件B中的内容 - 您需要连接两个!
在您的第二个文件中添加<xsd:include>
:
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://me.com/Exceptions.xsd"
targetNamespace="http://me.com/Exceptions.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://me.com/Exceptions.xsd Exceptions.xsd"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:include schemaLocation="exceptiontype.xsd"/>
<xs:element name="SpecificException" type="ExceptionType" />
</xs:schema>
这应该可以做到!
马克