XML и XSLT (4) Матросов Александр Васильевич Санкт-Петербургский государственный университет Действительный XML-документ • Жалобы пользователей: – Сложность определений DTD – Необходимость изучения нового языка • Схемы XML сложнее определений DTD, но их возможности богаче: – Определить структуру документа (как и DTD) – Задать фактические типы данных каждого элемента (в DTD только #PCDATA) – Наследовать структуру других схем – Создавать простые и составные типы данных – Минимальное и максимальное появление элемента в документе – Ограничивать диапазоны значений – Возможность определения уникальности любого атрибута • Спецификации можно найти – http://www.w3.org/TR/xmlschema-0/ - учебник для начинающих – http://www.w3.org/TR/xmlschema-1/ - структуры XML-схем, формальные подробности их создания – http://www.w3.org/TR/xmlschema-2/ - типы данных XML-схем, все о типах данных, используемых в схемах 2 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 + "<br>"+ "Сообщение ошибки: " + e.message + "<br>"+ "Вспомогательный код ошибки: " + (e.number>>16 & 0x1FFF) + "<br>" + "Истинный код ошибки: " + (e.number & 0xFFFF) + "<br>" + "Номер ошибки: "+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 + "<br>" + xmlDoc.parseError.reason; } else{ output.innerHTML = "Ошибок в xml-документе нет!"; } 3 Простой пример (1) • • DTD <!ELEMENT poem (title, picture, verse+)> <!ATTLIST poem publisher CDATA #IMPLIED pubyear CDATA #IMPLIED> <!ELEMENT title (#PCDATA)> <!ELEMENT verse (#PCDATA)> <!ELEMENT picture EMPTY> <!ATTLIST picture href CDATA #REQUIRED a-dtype CDATA #FIXED "href anyURI"> XML-документ <?xml version="1.0" ?> <!DOCTYPE poem SYSTEM "samplePoem.dtd"> <poem publisher="Boni and Liveright" pubyear="1922"> <!--<poem xmlns="http://www.poetry.net/poets" publisher="Boni and Liveright« pubyear="1922">--> <title>The Waste Land</title> <picture href="pic1.gif"/> <verse>April is the cruellest month, breeding</verse> <verse>Lilacs out of the dead land</verse> </poem> 4 Простой пример (2) • XML-схема <?xml version="1.0" ?> <xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:poem=http://www.poetry.net/poets targetNamespace="http://www.poetry.net/poets"> <xsd:element name="poem"> <xsd:complexType> <xsd:sequence> <xsd:element ref="poem:title"/> <xsd:element ref="poem:picture"/> <xsd:element ref="poem:verse" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="publisher" type="xsd:string"/> <xsd:attribute name="pubyear" type="xsd:NMTOKEN"/> </xsd:complexType> </xsd:element> <xsd:element name="title" type="xsd:string"/> <xsd:element name="verse" type="xsd:string"/> <xsd:element name="picture"> <xsd:complexType> <xsd:attribute name="href" use="required" type="xsd:anyURI"/> </xsd:complexType> </xsd:element> </xsd:schema> 5 Встроенные примитивные типы данных (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 – секунд; 6 Встроенные примитивные типы данных (2) • Даты и время – date – дата в формате YYYY-MM-DD (отрицательные -YYYY-MM-DD даты до новой эры) – time – время в формате hh:mm:ss (секунды могут иметь дробную часть), если время по UTC (или GMT), то добавить в конце суффикс Z, можно добавить + или - и после них смещение относительно Гринвича hh:mm – dateTime – комбинация двух предыдущих типов • Повторяющиеся даты – gDay – день месяца в формате ---DD (8 день каждого месяца --08) – gMonth – месяц в формате --MM (июнь --06) – gMonthDay – месяц и день в формате –MM-DD (3 июня -06-03) – gYear – год в формате YYYY (минус – до нашей эры) – gYearMonth – год и месяц в формате YYYY–MM (минус – до нашей эры) 7 Производные типы данных (1) • Целые – – – – – • integer – любое целое positiveInteger – положительное целое (>0) negativeInteger – отрицательное целое (<0) nonPositiveInteger – неположительное целое (<=0) nonNegativeInteger – неотрицательное целое (>=0) Компьютерные целые byte – 8-битное (между -128 и 127) unsignedByte – 8-битное (между 0 и 255) short – 16-битное (между -32768 и 32767) unsignedShort – 16-битное (между 0 и 65535) int – 32-битное (между -2147483648 и 2147483647) unsignedInt – 32-битное (между 0 и 4294967295) long – 64-битное (между -9223372036854775808 и 9223372036854775807) – unsignedLong – 64-битное (между 0 и 18446744073709551615) – – – – – – – 8 Производные типы данных (2) • Типы для XML-атрибутов – ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS • Типы для XML-конструкций – Name – имя, начинающееся с буквы, подчеркивания или двоеточия – language – те же значения, что и атрибут xml:lang – NCName – имя без символа двоеточия в нем – normalizedString – строка, в которой символы табуляции и перехода на новую строку заменены пробелами (нормализованная строка) – token – строка, в которой непрерывная последовательность пробельных символов заменена одним пробелом, а лидирующие и замыкающие пробелы удалены 9 Определение новых типов данных (1) • Элемент simpleType используется в XSDL для определения пользовательского производного типа • Разные способы образования производных типов с помощью специальных дочерних элементов: – list (построение списком) – создается новый тип, значениями которого является список значений исходного типа – union (построение объединением) – новый тип образуется слиянием двух или более типов данных, значениями которого являются данные любого из участвующих в объединении типов – restriction (построение ограничением) – новый тип образуется сужением области допустимых значений исходного типа 10 Определение новых типов данных (2) • Списком (обычно множественная форма от имени исходного типа) – Из существующего типа <xsd:simpleType name="dates"> <xsd:annotation> <xsd:documentation>Multiple dates</xsd:documentation> </xsd:annotation> <xsd:list itemType="xsd:date"/> </xsd:simpleType> – Из анонимного типа <xsd:simpleType name="pubDates"> <xsd:list> <xsd:simpleType> ... анонимное определение типа pubDate </xsd:simpleType> </xsd:list> </xsd:simpleType> 11 Определение новых типов данных (3) • Объединение – способ комбинирования существующих типов в один, например, объединить даты разных календарей: – григорианские date – Древний календарь ацтеков – Древний календарь иудеев • Проблема в объединении типов – литеральные значения могут совпадать (григорианский тип начинается с цифры, а ацтекский и иудейский можно разработать так, что они начнутся, соответственно, с A (Aztec) и H (Hebrew) – <xsd:simpleType name="AnyKindDate"> <xsd:union memberTypes="myns:AztecDate myns:HebrewDate xsd:date"> ... можно добавить к типам в атрибуте memberTypes (или вместо них без указанного атрибута) определение анонимных типов, входящих в объединение </xsd:union> </xsd:simpleType> • При возможности трактовки литерала в нескольких объединяемых типах, приоритет имеет тот, который первый в перечислении, начиная с атрибута memberTypes 12 Определение новых типов данных (4) • • • • • Ограничение – способ построения нового типа введением ограничений на значения базового встроенного или пользовательского типа Ограничения задаются в единственном элементе restriction, в атрибуте base которого задается ограничиваемый тип Сами ограничения задаются с помощью фиксированного числа способов (ограничивающие фасеты – constraining facets) (их всего 12, разделенных на 6 типов) Фасеты – подэлементы элемента restriction Ограничения диапазона – minInclusive, maxInclusive, minExclusive, maxExclusive – <xsd:simpleType name="pubYear"> <xsd:restriction base="xsd:gYear"> <xsd:minInclusive value="1000"/> <xsd:maxInclusive value="2100"/> </xsd:restriction> </xsd:simpleType> • Базовый тип можно задать и как анонимный тип через элемент simpleType, определяемый без атрибутов 13 Определение новых типов данных (5) • Ограничения длины – Длина для спискового типа (например, IDREFS) – количество элементов в списке – Длина для строкового типа (производного непосредственно или через несколько уровней наследования от типа string) – количество символов в строке – Длина для двоичного типа – количество байт в декодированных двоичных данных – minLength, maxLength, length • Ограничения десятичных цифр – Применяются к десятичным числам и типам от них производных – totalDigits и fractionDigits • Ограничение перечислением – <xsd:simpleType name="holiday"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Суббота"/> <xsd:enumeration value="Воскресенье"/> </xsd:restriction> </xsd:simpleType> 14 Определение новых типов данных (6) • Фасет whiteSpace – Ограничивает не значения , а процесс обработки – preserve – сохранение процессором при обработке данных пробельных символов – replace – замена процессором при обработке данных любого пробельного символа в пробел – collapse – процессор при обработке данных заменяет непрерывную последовательность пробельных символов одним пробелом, убирая начальные и конечные пробельные символы • Фасет pattern (регулярное выражение) – Синтаксис регулярных выражений Perl 15 Определение новых типов данных (7) • Фасет pattern (регулярное выражение) – Ограничивает не значения , а процесс обработки – preserve – сохранение процессором при обработке данных пробельных символов – replace – замена процессором при обработке данных любого пробельного символа в пробел – collapse – процессор при обработке данных заменяет непрерывную последовательность пробельных символов одним пробелом, убирая начальные и конечные пробельные символы 16