Схема отчета, 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
более подробно позднее.