XSD с разделенными сложными типами с использованием targetNamespace - PullRequest
0 голосов
/ 14 октября 2018

Я написал очень простой XML:

<?xml version="1.0" encoding="utf-8"?>
<something attribute1="21" attribute2="23">
  <newelement code="code1"/>
</something>

И я хотел написать XSD для проверки этого XML, который отлично работает:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="something">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="newelement" nillable="true">
                    <xs:complexType>
                        <xs:attribute type="xs:string" name="code"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="attribute1" type="xs:int"/>
            <xs:attribute name="attribute2" type="xs:int"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Но потом я хотел написатьтот же XSD, но с разделенными комплексными типами , потому что, например, что если мне понадобится та же структура, что и у newelement сейчас.Поэтому я реорганизовал свой XSD следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="my-common-types"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="my-common-types">
    <xs:element name="something">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="newelement" nillable="true" type="tns:ElementWithCode"/>
            </xs:sequence>
            <xs:attribute name="attribute1" type="xs:int"/>
            <xs:attribute name="attribute2" type="xs:int"/>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="ElementWithCode">
        <xs:attribute name="code" type="xs:string"/>
    </xs:complexType>
</xs:schema>

И затем я всегда получаю эту ошибку:

ОШИБКА: Элемент 'что-то': для проверки не найдено подходящего глобального объявленияroot.

Итак, существует проблема с использованием атрибута targetNamespace на схеме, но я не понимаю, как я могу заставить это работать.Пожалуйста, дайте мне несколько советов.Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

В XML и XSD отсутствовали части.

В XML отсутствовал атрибут xmlns="my-common-types" из элемента <something>.

В XSD отсутствовал атрибут elementFormDefault="qualified" из <xs:schema> элемент.

0 голосов
/ 14 октября 2018

Ваша реорганизованная схема предназначена для пространства имен "my-common-types", тогда как оригинал не содержал пространства имен.Если вы хотите, чтобы ваши элементы не находились в пространстве имен, тогда (глобальные) объявления элементов должны быть в документе схемы, который не имеет targetNamespace.Вы все еще можете поместить объявления типов в пространство имен, если хотите, но тогда они должны будут находиться в отдельном документе схемы, который импортируется в документ схемы без пространства имен с использованием xs:import.

...