XML и XSLT (4) Матросов Александр Васильевич Санкт-Петербургский государственный университет
2 Действительный XML-документ Жалобы пользователей: –Сложность определений DTD –Необходимость изучения нового языка Схемы XML сложнее определений DTD, но их возможности богаче: –Определить структуру документа (как и DTD) –Задать фактические типы данных каждого элемента (в DTD только #PCDATA) –Наследовать структуру других схем –Создавать простые и составные типы данных –Минимальное и максимальное появление элемента в документе –Ограничивать диапазоны значений –Возможность определения уникальности любого атрибута Спецификации можно найти – - учебник для начинающих – - структуры XML-схем, формальные подробности их создания – - типы данных XML-схем, все о типах данных, используемых в схемах
3 XML-схемы в Internet Explorer MSXML 4.0 и выше (msxml4.dll) function runParser(xmlFileName, namespace, xsdFileName){ var xmlSchema = new ActiveXObject("Msxml2.XMLSchemaCache.5.0"); try{ xmlSchema.add(namespace, xsdFileName); }catch(e){ output.innerHTML = "Название ошибки: " + e.name + " "+ "Сообщение ошибки: " + e.message + " "+ "Вспомогательный код ошибки: " + (e.number>>16 & 0x1FFF) + " " + "Истинный код ошибки: " + (e.number & 0xFFFF) + " " + "Номер ошибки: "+e.number return; } var xmlDoc = new ActiveXObject("Msxml2.DomDocument.5.0"); xmlDoc.async = false; xmlDoc.schemas = xmlSchema; xmldoc.validateOnParse = true; xmlDoc.load(xmlFileName); if(xmlDoc.parseError.errorCode != 0){ output.innerHTML = xmlDoc.parseError.errorCode + " " + xmlDoc.parseError.reason; } else{ output.innerHTML = "Ошибок в xml-документе нет!"; } }
4 Простой пример (1) DTD XML-документ --> The Waste Land April is the cruellest month, breeding Lilacs out of the dead land
5 Простой пример (2) XML-схема
6 Встроенные примитивные типы данных (1) Разработан язык определения XML-схем (XML Schema Definition Language – XSDL) Типы данных языков программирования –string – строка символов (CDATA) –boolean – false ( 0 ) или true ( 1 ) –decimal – вещественные числа произвольной точности –float – одинарной точности 32-битные вещественные числа –double – двойной точности 64-битные вещественные числа Типы данных XML –anyURI – URI (URN+URL) –QName – строка, квалифицированная префиксом пространства имен prefix:строка –NOTATION – соответствует XML-типу NOTATION атрибута Двоичные типы данных –hexBinary – двоичные данные в шестнадцатеричной нотации –base64Binary – base-64 закодированные данные Длительности (периоды времени) –P начальный префикс – Y – года; M – месяца; D – дней; –T символ, после которого отсчет минут, секунд и т.д. – H – часов; M – минут; S – секунд;
7 Встроенные примитивные типы данных (2) Даты и время –date – дата в формате YYYY-MM-DD (отрицательные -YYYY-MM-DD даты до новой эры) –time – время в формате hh:mm:ss (секунды могут иметь дробную часть), если время по UTC (или GMT), то добавить в конце суффикс Z, можно добавить + или - и после них смещение относительно Гринвича hh:mm –dateTime – комбинация двух предыдущих типов Повторяющиеся даты –gDay – день месяца в формате ---DD (8 день каждого месяца ) –gMonth – месяц в формате --MM (июнь --06 ) –gMonthDay – месяц и день в формате –MM-DD (3 июня ) –gYear – год в формате YYYY (минус – до нашей эры) –gYearMonth – год и месяц в формате YYYY–MM (минус – до нашей эры)
8 Производные типы данных (1) Целые –integer – любое целое –positiveInteger – положительное целое (>0) –negativeInteger – отрицательное целое (<0) –nonPositiveInteger – неположительное целое (<=0) –nonNegativeInteger – неотрицательное целое (>=0) Компьютерные целые –byte – 8-битное (между -128 и 127 ) –unsignedByte – 8-битное (между 0 и 255 ) –short – 16-битное (между и ) –unsignedShort – 16-битное (между 0 и ) –int – 32-битное (между и ) –unsignedInt – 32-битное (между 0 и ) –long – 64-битное (между и ) –unsignedLong – 64-битное (между 0 и )
9 Производные типы данных (2) Типы для XML-атрибутов –ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS Типы для XML-конструкций –Name – имя, начинающееся с буквы, подчеркивания или двоеточия –language – те же значения, что и атрибут xml:lang –NCName – имя без символа двоеточия в нем –normalizedString – строка, в которой символы табуляции и перехода на новую строку заменены пробелами (нормализованная строка) –token – строка, в которой непрерывная последовательность пробельных символов заменена одним пробелом, а лидирующие и замыкающие пробелы удалены
10 Определение новых типов данных (1) Элемент simpleType используется в XSDL для определения пользовательского производного типа Разные способы образования производных типов с помощью специальных дочерних элементов: –list (построение списком) – создается новый тип, значениями которого является список значений исходного типа –union (построение объединением) – новый тип образуется слиянием двух или более типов данных, значениями которого являются данные любого из участвующих в объединении типов –restriction (построение ограничением) – новый тип образуется сужением области допустимых значений исходного типа
11 Определение новых типов данных (2) Списком (обычно множественная форма от имени исходного типа) –Из существующего типа Multiple dates –Из анонимного типа... анонимное определение типа pubDate
12 Определение новых типов данных (3) Объединение – способ комбинирования существующих типов в один, например, объединить даты разных календарей: –григорианские date –Древний календарь ацтеков –Древний календарь иудеев Проблема в объединении типов – литеральные значения могут совпадать (григорианский тип начинается с цифры, а ацтекский и иудейский можно разработать так, что они начнутся, соответственно, с A (Aztec) и H (Hebrew) –... можно добавить к типам в атрибуте memberTypes (или вместо них без указанного атрибута) определение анонимных типов, входящих в объединение При возможности трактовки литерала в нескольких объединяемых типах, приоритет имеет тот, который первый в перечислении, начиная с атрибута memberTypes
13 Определение новых типов данных (4) Ограничение – способ построения нового типа введением ограничений на значения базового встроенного или пользовательского типа Ограничения задаются в единственном элементе restriction, в атрибуте base которого задается ограничиваемый тип Сами ограничения задаются с помощью фиксированного числа способов (ограничивающие фасеты – constraining facets) (их всего 12, разделенных на 6 типов) Фасеты – под элементы элемента restriction Ограничения диапазона –minInclusive, maxInclusive, minExclusive, maxExclusive – Базовый тип можно задать и как анонимный тип через элемент simpleType, определяемый без атрибутов
14 Определение новых типов данных (5) Ограничения длины –Длина для спискового типа (например, IDREFS) – количество элементов в списке –Длина для строкового типа (производного непосредственно или через несколько уровней наследования от типа string) – количество символов в строке –Длина для двоичного типа – количество байт в декодированных двоичных данных –minLength, maxLength, length Ограничения десятичных цифр –Применяются к десятичным числам и типам от них производных –totalDigits и fractionDigits Ограничение перечислением –
15 Определение новых типов данных (6) Фасет whiteSpace –Ограничивает не значения, а процесс обработки –preserve – сохранение процессором при обработке данных пробельных символов –replace – замена процессором при обработке данных любого пробельного символа в пробел –collapse – процессор при обработке данных заменяет непрерывную последовательность пробельных символов одним пробелом, убирая начальные и конечные пробельные символы Фасет pattern (регулярное выражение) –Синтаксис регулярных выражений Perl
16 Определение новых типов данных (7) Фасет pattern (регулярное выражение) –Ограничивает не значения, а процесс обработки –preserve – сохранение процессором при обработке данных пробельных символов –replace – замена процессором при обработке данных любого пробельного символа в пробел –collapse – процессор при обработке данных заменяет непрерывную последовательность пробельных символов одним пробелом, убирая начальные и конечные пробельные символы