Простые типы
XML-схема заказа на покупку содержит объявления нескольких элементов и атрибутов простого типа. Некоторые из этих простых типов, например string и decimal встроены в язык XML-схемы, в то время как другие определены специально для данного типа документа. Например, атрибут partNum имеет тип по имени SKU (Stock Keeping Unit), который получен из встроенного простого типа string. Встроенные простые типы, и их вариации могут использоваться в объявлениях элементов и атрибутов. В таблице 2 приводится список простых встроенных в язык XML-схемы типов.
Таблица 2. Список простых типов
Простой тип | Примеры (разграничены запятыми) | Примечания |
string | Confirm this is electric | |
normalizedString | Confirm this is electric | см., 3) |
token | Confirm this is electric | см., 4) |
byte | -1, 126 | см., 2) |
unsignedByte | 0, 126 | см., 2) |
base64Binary | GpM7 | |
hexBinary | 0FB7 | |
integer | -126789, -1, 0, 1, 126789 | см., 2) |
positiveInteger | 1, 126789 | см., 2) |
negativeInteger | -126789, -1 | см., 2) |
nonNegativeInteger | 0, 1, 126789 | см., 2) |
nonPositiveInteger | -126789, -1, 0 | см., 2) |
int | -1, 126789675 | см., 2) |
unsignedInt | 0, 1267896754 | см., 2) |
long | -1, 12678967543233 | см., 2) |
unsignedLong | 0, 12678967543233 | см., 2) |
short | -1, 12678 | см., 2) |
unsignedShort | 0, 12678 | см., 2) |
decimal | -1.23, 0, 123.4, 1000.00 | см., 2) |
float | -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN | 32-х битовое число однократной точности с плавающей запятой. NaN - число не задано, прим. (2) |
double | -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN | 64-х битовое число двойной точности с плавающей запятой, см., 2) |
boolean | true, false 1, 0 | |
time | 13:20:00.000, 13:20:00.000-05:00 | см., 2) |
dateTime | 1999-05-31T13:20:00.000-05:00 | 31 мая 1999 года 13 часов 20 минут Восточноевропейского стандартного времени, которое на 5 часов отстает от Универсального времени. См.,2) |
duration | P1Y2M3DT10H30M12.3S | 1 год, 2 месяца, 3 дня, 10 часов, 30 минут, и 12.3 секунды |
date | 1999-05-31 | см., 2) |
gMonth | --05-- | Май, см., 2) и 5) |
gYear | 1999 | 1999, см., 2) и 5) |
gYearMonth | 1999-02 | Февраль 1999 года, не зависимо от номера дня, см., 2) и 5) |
gDay | ---31 | 31 день, см., 2) и 5) |
gMonthDay | --05-31 | 31 мая, см., 2) и 5) |
Name | shipTo | XML 1.0 тип Name |
QName | po:USAddress | XML Namespace QName |
NCName | USAddress | XML Namespace NCName, то есть QName без префикса и двоеточия |
anyURI | , | |
language | en-GB, en-US, fr | Значения допустимые для xml:lang как определено в XML 1.0 |
ID | XML 1.0 атрибут типа ID, см., 1) | |
IDREF | XML 1.0 атрибут типа IDREF, см., 1) | |
IDREFS | XML 1.0 атрибут типа IDREFS, см., 1) | |
ENTITY | XML 1.0 атрибут типа ENTITY, см., 1) | |
ENTITIES | XML 1.0 атрибут типа ENTITIES, см., 1) | |
NOTATION | XML 1.0 атрибут типа NOTATION, см., 1) | |
NMTOKEN | US, Bresil | XML 1.0 атрибут типа NMTOKEN, см., 1) |
NMTOKENS | US UK, Bresil Canada Mexique | XML 1.0 атрибут типа NMTOKENS, то есть список NMTOKEN разделенных пробелами, см., 1) |
Примечания: 1) Для обеспечения совместимости XML-схем и XML 1.0 DTD, простые идентификаторы типов ( IDREF, IDREFS, ENTITY, ENTITIES, NOTATION, NMTOKEN, NMTOKENS), должны использоваться только в атрибутах. 2) Значение этого типа может быть представлено больше чем одним лексическим форматом. Например, 100 и 1.0E2 - оба значения представлены в формате с плавающей точкой, и значением равным "сто". Однако, для этого типа были установлены правила, которые определяют канонический лексический формат (см., "XML-схема. Часть 2: Типы данных"). 3) Символы перевода строки, табуляции, и перевода каретки в типе normalizedString перед обработкой схемы преобразуются в пробелы. 4) Как и в normalizedString, смежные пробелы сокращены до единственного пробела, предшествующие и завершающие пробелы удаляются. 5) Префикс "g", задает время по Григорианскому календарю. |
Новые простые типы можно определить, получая их от существующих простых типов (встроенных или ранее определенных). В частности мы можем получить новый простой тип, ограничивая существующий простой тип. Другими словами, для нового типа мы можем установить собственный диапазон значений как подмножество диапазона значений существующего типа. Для определения имени и типа собственного простого типа используют оператор simpleType. При этом c помощью оператора restriction указывают прототип, и идентифицируют фасеты (параметры), которые ограничивают диапазон значений базового типа. Список фасетов приводится в приложении B.
Предположим, что мы хотим создать новый тип целого числа, названного myInteger, чей диапазон значений должен находиться между 10000 и 99999 (включительно). Мы базируем наше определение на встроенном простом типе integer, чей диапазон значений включает так же и целые числа как меньше чем 10000, так и больше чем 99999. Чтобы определить тип myInteger, мы ограничиваем диапазон базового типа integer, используя два фасета, названные minInclusive и maxInclusive.
Определение myInteger. Диапазон 10000-99999:
![](image/prostye-tipy_1.gif)
Приведенный пример показывает использование одной из возможных комбинаций базового типа, и двух фасетов, которые были применены для определения myInteger. Но возможно использование и других комбинаций встроенных простых типов и фасетов (см., приложение B). Рассмотрим более сложный пример определения простого типа. Тип по имени SKU получен из простого типа string. Мы ограничиваем значения SKU путем использования фасета pattern, который содержит регулярное выражение, определяющее допустимый формат строки "\d{3}-[A-Z]{2}". Это выражение читается следующим образом: "строка начинается с трех цифр, за которыми следует дефис, за дефисом следует два ASCII-символами верхнего регистра".
Определение простого типа SKU:
![](image/6.gif)
Более полно язык регулярных выражений описан в приложении D.
Язык XML-схем определяет пятнадцать фасетов, которые перечислены в приложении B. Среди них особенно полезен фасет enumeration. Его можно использовать для ограничения значения почти каждого простого типа, кроме boolean. Фасет enumeration ограничивает простой тип набором явных значений. Например, мы можем использовать enumeration, чтобы определить новый простой тип по имени USState, полученный из типа string, значение которого должно быть одним из стандартных сокращений наименования штатов США.
Использование фасета enumeration:
![](image/7.gif)
Использование типа USState является хорошей заменой типа string, при использовании в элементе state (содержит наименование штата). За счет такой замены мы можем ограничить значения элемента state в подэлементах billTo и shipTo. При этом эти значения ограничены следующим перечнем: AK, АL, AR, и т.д. Обратите внимание, что перечисляемые значения, указанные для данного типа должны быть уникальны.