Мы определили пространство имен xmlns:abc="http://example.org/ns/abc"
и схему XML для него.Эта XML-схема определяет элементы и типы данных.
Эта abc
XML-схема включает в себя
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
, что позволяет использовать элементы из другого пространства имен.
Далее мы имеемопределил пространство имен xmlns:testing="http://example.org/ns/testing"
и схему XML для него.Эта тестирующая XML-схема импортирует пространство имен abc и его XML-схему на <xs:import namespace="http://example.org/ns/abc" schemaLocation="abc.xsd"/>
, поскольку некоторые элементы данных, определенные в пространстве имен abc, должны использоваться для элементов тестового пространства имен.
Наконец, мы создали XMLдокумент, использующий как пространства имен, так и схемы XML:
<rootElement xmlns="http://example.org/ns/abc" xmlns:testing="http://example.org/ns/abc" xsi:schemaLocation="http://example.org/ns/abc abc.xsd http://example.org/ns/testing testing.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<abcElement1>Some text</abcElement1>
<testing:element1/>
</rootElement>
При проверке этого документа XML мы получаем ошибки "... имя элемента ... уже объявлено", указывая на https://www.w3.org/TR/xmlschema-1/#sch-props-correct
Похоже, что невозможно импортировать пространство имен со своей схемой в другое пространство имен, если это другое пространство имен используется в контексте первого пространства имен / схемы - своего рода его повторное использование.
Есть ли лучший способ вложения пространства имен / схемы abc или единственная альтернатива для разделения пространства имен abc на одно, содержащее только элементы, а другое - новое, содержащее определения типов данных и импортирующее это пространство имен типа данных в тестовое пространство имен /схема?
Вот полные примеры: abc.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://example.org/ns/abc" targetNamespace="http://example.org/ns/abc" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="rootElement">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="abcElement1" type="xs:string" minOccurs="0"/>
<xs:element name="abcEntity" minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="EntityType1">
<xs:sequence>
<xs:element name="identifier" type="xs:string"/>
<xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
testing.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.org/ns/testing" xmlns:abc="http://example.org/ns/abc" targetNamespace="http://example.org/ns/testing" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:import namespace="http://example.org/ns/abc" schemaLocation="abc.xsd"/>
<xs:element name="element1">
<xs:complexType>
<xs:sequence>
<xs:element name="person" type="abc:EntityType1" minOccurs="0"/>
<xs:element name="company" type="abc:EntityType1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Пример документа 1 - ссылки на схемы как локальные файлы:
<?xml version="1.0" encoding="UTF-8"?>
<rootElement xmlns="http://example.org/ns/abc" xmlns:testing="http://example.org/ns/testing" xsi:schemaLocation="http://example.org/ns/abc abc.xsd http://example.org/ns/testing testing.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<abcElement1>Some text</abcElement1>
<testing:element1>
<testing:person>
<identifier>http://example.com/entity/134134234</identifier>
</testing:person>
</testing:element1>
</rootElement>
... и этот документ может быть проверен, ошибка не выдается.
Затем я загрузилabc.xsd на один из моих веб-сайтов и замените имя локального файла его URL-адресом:
xsi:schemaLocation="http://example.org/ns/abc http://data.newsit.biz/fortesting/abc.xsd http://example.org/ns/testing testing.xsd"
... и пример документа с этим xsi: schemaLocation выдает ошибку, упомянутую выше.Почему разница в использовании XML-схемы как локального файла или веб-ресурса?
Программное обеспечение, используемое для проверки: XMLspy 2018 rel2 sp1
Сообщения об ошибках:
- Недопустимый файл exampleDocument2.xml
- Схемы, на которые ссылаются атрибуты xsi: schemaLocation или xsi: noNamespaceSchemaLocation в элементе, недопустимы.
- 'abc: rootElement' уже объявлен.
- ссылка на https://www.w3.org/TR/xmlschema-1/#sch-props-correct
- Это "... уже объявлено, и ссылка показана также для abc: EntityType1