XML04

реклама
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
Скачать