5.4 Импортирование типов

Схема отчета, report.xsd, использует простой тип xipo:SKU, который определен в другой схеме и в другом целевом пространстве имен. Для ee повторного вызова мы использовали include, чтобы схема в ipo.xsd могла использовать определения и объявления из address.xsd. Однако здесь мы не можем использовать include, поскольку он может только применяться в определениях и объявлениях схемы, целевое пространство имен которой то же самое, что и целевое пространство имен включаемой схемы. Следовательно, элемент include не идентифицирует пространство имен (хотя он требует schemaLocation). Механизм импортирования, описываемый в этом разделе, является важным механизмом, который дает возможность компонентам схемы из различных целевых пространств имен использоваться вместе, и, следовательно, обеспечивает проверку правильности схемы содержания примера, определяемой в области нескольких пространств имен.

Для того чтобы импортировать тип SKU и использовать его в схеме отчета, мы идентифицируем пространство имен, в котором SKU определен, и связываем это пространство имен для использования в схеме отчета с префиксом. Конкретно, мы используем элемент import для идентификации целевого пространство имен http://www.example.com/IPO и связываем его с префиксом xipo, используя стандартное объявление пространства имен. На простой тип SKU, определенный в пространстве имен http://www.example.com/IPO теперь можно ссылаться как xipo:SKU в любом определении и объявлении схемы отчета.

В нашем примере мы импортировали один простой тип из одного внешнего пространства имен и использовали его для объявления атрибутов. Фактически XML Schema разрешает нескольким компонентам схемы быть импортированным из нескольких пространств имен. При этом на них можно ссылаться и в определениях и в объявлениях. Например, в report.xsd мы могли дополнительно многократно использовать элемент comment, объявленный в ipo.xsd ссылаясь на тот элемент в объявлении:

<element ref="xipo:comment"/>

Однако отметим, что мы не можем использовать элемент shipTo из po.xsd, и следующее не правильно, поскольку  только глобальные компоненты схемы могут быть импортированы:

<element ref="xipo:shipTo"/>

В ipo.xsd, comment объявлен как глобальный элемент, другими словами он объявлен в элементе schema. Напротив, shipTo объявлен локально, другими словами он является элементом, объявленным в определении сложного типа, заданного типом PurchaseOrderType.

Сложные типы также могут быть импортированы, и они могут использоваться как исходные типы для получения новых типов. Только именованные сложные типы могут быть импортированы, а локальные, анонимно определенные типы, не могут. Предположим, мы хотим включить в наш отчет имя аналитика, наряду с  контактной информацией. Мы можем многократно использовать (глобально определенный) сложный тип USAddress из address.xsd, и расширить его для того, чтобы определить новый тип с именем Analyst, добавляя новые элементы phone и email:

Определение Analyst посредством расширения USAddress

<complexType name="Analyst">
 <complexContent>
  <extension base="xipo:USAddress">
   <sequence>
    <element name="phone" type="string"/>
    <element name="email" type="string"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

Используя этот новый тип, мы объявляем элемент с именем analyst как часть объявления элемента purchaseReport (объявления не показаны) в схеме отчета. Тогда, следующий экземпляр документа соответствовал бы модифицированной схеме отчета:

Экземпляр документа, соответствующий схеме отчета с типом Analyst

<purchaseReport
  xmlns="http://www.example.com/Report"
  period="P3M" periodEnding="1999-12-31">
  <!-- regions and parts elements omitted -->
   <analyst>
	<name>Wendy Uhro</name>
	<street>10 Corporate Towers</street>
	<city>San Jose</city>
	<state>CA</state>
	<zip>95113</zip>
	<phone>408-271-3366</phone>
	<email>uhro@example.com</email>
   </analyst>
</purchaseReport>

Когда компоненты схемы импортированы из нескольких пространств имен, каждое пространство имен должно быть определено с отдельным элементом import. Элементы import сами должны представляться как первые дочерние элементы элемента schema. Кроме того, каждое пространство имен должно быть связано с префиксом, используя стандартное объявление пространства имен, и этот префикс применяется для квалифицирования ссылки к любым компонентам схемы, принадлежащим этому пространству имен. Наконец, элементы import могут содержать необязательный атрибут schemaLocation для того, чтобы помочь определить местонахождение ресурсов, связанных с пространством имен. Мы обсудим атрибут schemaLocation более подробно позднее.

 

Сайт создан в системе uCoz