В сценарии нашего примера, счета на покупку сгенерированы в ответ
на счета клиентов, при этом могут
формироваться адреса для поставки товара и в счетах на оплату с указанием
разных стран. Международный счет на покупку, ipo.xml
представленный ниже,
иллюстрирует один такой случай, где товары отправлены в Великобританию, а счет
послан по американскому адресу. Ясно, что лучше, когда мы просто можем добавлять
новые сложные типы международного адреса, посредством создания новых
образований из Address.
Схема для международных счетов на покупку
в этом случае не должна расшифровывать каждую возможную комбинацию
международных адресов для счета и отгрузки. XML Схема позволяет нам определять элементы billTo и shipTo как
типы Address
(см. ipo.xsd
), но использовать международные адреса
вместо Address
. Другими словами, документ примера,
содержание которого соответствует типу UKAddress,
будет правилен, если
содержание появится внутри документа, размещаясь, где ожидается Address
(при этом предполагается, что в UKAddress само содержание правильно).
Чтобы применить эту особенность работы XML Schema, и точно определить, какой производный
тип требуется, производный тип должен быть идентифицирован в документе. Тип
идентифицируется, используя атрибут
xsi:type
, который является частью пространства
имен XML Schema. В примере, ipo.xml
, используются производные типы UKAddress и USAddress, определенные
через значения, назначенные атрибутом xsi:type
.
<?xml version=”1.0”?> <ipo:purchaseOrder xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:ipo=”http://www.example.com/IPO” orderDate=”1999-12-01”> <shipTo exportCode=”1” xsi:type=”ipo:UKAddress”> <name>Helen Zoe</name> <street>47 Eden Street</street> <city>Cambridge</city> <postcode>CB1 1JR</postcode> </shipTo> <billTo xsi:type=”ipo:USAddress”> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>Old Town</city> <state>PA</state> <zip>95819</zip> </billTo> <items> <item partNum=”833-AA”> <productName>Lapis necklace</productName> <quantity>1</quantity> <USPrice>99.95</USPrice> <ipo:comment>Want this for the holidays!</ipo:comment> <shipDate>1999-12-05</shipDate> </item> </items> </ipo:purchaseOrder>
В Разделе 4.8 мы
опишем, как предохранить производные типы от использования в таком способе
замены.