Это ошибка в реализации XSD? Почему это не работает? - PullRequest
0 голосов
/ 27 августа 2009

У меня есть один 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 - Альтернатива 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 - Альтернатива 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 он НЕ МОЖЕТ найти ExceptionType, который объявлен в Exceptions.xsd, но в Альтернативе 2 он МОЖЕТ найти элемент Exception, который объявлен в Exceptions.xsd.

Почему не работает Альтернатива 1?

С уважением, Гийом Ханик

1 Ответ

3 голосов
/ 27 августа 2009

В вашем "Альтернативе 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>

Это должно сработать!

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...