Основы ссылки на схему xsd из другой схемы

Мы пишем новую схему xsd, которая будет основана на другой схеме (которая является стандартом де-факто для данных GPS GPX). Наша схема будет использоваться для проверки документов, созданных нашими клиентами, и при тестировании. Мне нужно лучше понять, как ссылаться на базовую схему из нашей новой схемы, особенно учитывая, что от наших систем нельзя ожидать подключения к Интернету.

Я понимаю, что ссылки на документы xsd на каком-то другом сервере обычно существуют, поэтому разработчик может получить документ во время разработки, но во время проверки работоспособности системы было бы разумно иметь локальную копию схемы, поскольку она не следует предусмотрительно вешать производство просто потому, что удаленный сервер недоступен. Правильно ли это?

Итак, если это так, то xsd ожидает, что я буду ссылаться на удаленную базовую схему xsd, но также имя и расположение некоторой локальной копии схемы? Или такая ссылка не нужна в моем новом файле схемы? Надеюсь, это имеет смысл. Благодарю.

Ответы

Ответ 1

Чтобы ссылаться на другую схему, это соглашение о том, что эта схема локальна для "основной" схемы, на которую вы ссылаетесь. Например, чтобы импортировать схему, которая определяет некоторые повторно используемые типы:

<xs:import namespace="http://CommonTypesNamespace/CommonTypes" 
           schemaLocation="CommonTypes.xsd"/>

В основном это говорит о существовании схемы CommonTypes.xsd, которая будет найдена в том же каталоге, что и моя основная схема. Атрибут schemaLocation используется как относительный путь к фактическому файлу схемы из моей схемы ссылок (ПРИМЕЧАНИЕ. Он также полностью необязателен - см. Мою заметку внизу этого ответа).

Чтобы использовать типы внутри CommonTypes.xsd, я сначала добавляю пространство имен общих типов в моем объявлении основной схемы:

<xs:schema targetNamespace="http://MyNamespace/MyTypes" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified" 
           xmlns:common="http://CommonTypesNamespace/CommonTypes">

Это говорит о том, что я хочу, чтобы типы из моей общей схемы были доступны в моей основной схеме с использованием префикса пространства имен "common".

Затем, например, для ссылки на общий тип "Адрес":

<xs:element name="DeliveryAddress" type="common:AddressType" />

Это говорит о том, что мой тип адреса доставки на самом деле тот же тип, что и AddressType, определенный в схеме общих типов.

Примечание: schemaLocation также может использоваться с URI, абсолютными или UNC-путями или вообще не существует, потому что это полностью необязательный атрибут. Если вы не используете schemaLocation, ваш синтаксический анализатор, скорее всего, сканирует локальные каталоги, которые ищут схему с правильным пространством имен, но это зависит от реализации.