XML и XSLT (3) Матросов Александр Васильевич Санкт-Петербургский государственный университет Действительный XML-документ • • • • Документ считается действительным, если в его состав включено определение DTD или XML-схема, а сам документ не противоречит определению DTD или схеме Определение DTD задает структуру XML-документа Определение DTD объявляется посредством элемента <!DOCTYPE> <!DOCTYPE rootname [DTD]> <!DOCTYPE rootname SYSTEM URL> <!DOCTYPE rootname SYSTEM URL [DTD]> <!DOCTYPE rootname PUBLIC identifier URL> <!DOCTYPE rootname PUBLIC identifier URL [DTD]> Встроенное DTD <?xml version="1.0" standalone="yes" encoding="UTF-8"?> <!DOCTYPE DOCUMENT [ <!ELEMENT DOCUMENT (GREETING, MESSAGE)> <!ELEMENT GREETING (#PCDATA)> <!ELEMENT MESSAGE (#PCDATA)> ]> <DOCUMENT> <GREETING>Hello From XML</GREETING> <MESSAGE>Добро пожаловать в мир XML.</MESSAGE> </DOCUMENT> 2 Проверка действительности на основе DTD • Модули проверки действительности XMLдокументов доступны в Интернете http://validator.w3.org/ • Использовать API и программные продукты различных компаний 3 Проверка действительности на основе DTD • • • • • • • • • • • • • • • • • • • • • • • • Microsoft (msxml) function loadXMLDoc(xmlFileName) { xmlDoc = new ActiveXObject("MSXML.DomDocument"); xmlDoc.async = false; xmlDoc.validateOnParse = true; xmlDoc.load(xmlFileName); if(xmlDoc.parseError.errorCode != 0){ var errorString = xmlDoc.parseError.srcText errorString = xmlDoc.parseError.srcText.replace(/\</g, "&lt;") errorString = errorString.replace(/\>/g, "&gt;") document.getElementById("output").innerHTML = "Проблема в документе " + xmlDoc.parseError.url + ", строка " + xmlDoc.parseError.line + ", позиция " + xmlDoc.parseError.linepos + ":<BR>Источник ошибки: " + errorString + "<BR>Причина ошибки: " + xmlDoc.parseError.reason + "<BR>" + "Ошибка: " + xmlDoc.parseError.errorCode } else{ document.getElementById("output").innerHTML = "Ошибок в xml-документе нет!"; } } Задание: создать страницу HTML, на которой пользователь выбирает xml-документ и затем он проверяется на правильность. Если неправилен, то ошибка, если правильный, то отобразить его на этой же странице и в отдельном окне браузера 4 Объявления элементов (1) • <!ELEMENT имя модель_содержимого> • <!ELEMENT имя EMPTY> пустой элемент без содержимого, но может иметь атрибуты • <!ELEMENT имя ANY> любой тип содержимого (любой элемент или символьные данные в любом порядке – фактически содержимое элемента не проверяется) • <!ELEMENT имя (имя_дочернего_эл)> содержит один дочерний элемент • <!ELEMENT имя (#PCDATA)> содержит обычный текст (разобранные символьные данные – parced character data) (единственный способ указания формата фактического символьного содержимого элемента) • Считается, что порядок объявления элементов не имеет значения 5 Объявления элементов (2) • Множественные дочерние элементы объявляются с помощью синтаксиса регулярных выражений a+ одно или больше появлений a a* нуль или больше появлений a a? одно или ни одного появлений a a, b после a следует b a | b a или b, но не оба сразу (выражение) единый модуль и к нему можно применять квантификаторы • Смешанный тип '(' S? '#PCDATA' (S? '|' S? Имя)* S? ')*' | '(' S? '#PCDATA' S? ')' можно задавать только имена дочерних элементов, но не порядок их появления и количество • Можно использовать комментарии 6 Внешние определения DTD • DTD в файле вводится в документ для использования группой лиц (закрытый идентификатор): <!DOCTYPE rootname SYSTEM URL> <!DOCTYPE rootname SYSTEM URL [DTD]> • DTD для всеобщего использования: <!DOCTYPE rootname PUBLIC identifier URL> <!DOCTYPE rootname PUBLIC identifier URL [DTD]> • Формальный открытый идентификатор (formal public identifier – FPI) (// - разделитель полей идентификатора) – Поле 1 – прошел ли стандартизацию («-» нет; «+» в данном случае стандарт не применяется, но DTD одобрено; для официальных стандартов имя этого стандарта, например, «ISO/IEC 13449:2000» – Поле 2 – описывает имя группы или лица, которое поддерживает или ответственно за это определение (уникальное имя) – Поле 3 – указывает тип документа, обычно сопровождается идентификатором версии – Четвертое поле – используемый определением DTD язык "-//starEditor//Custom XML Version 1.0//EN" 7 Объявления элементов: задания 1 • • Определить документы, у которых корневой элемент document содержит item+, item*, item?, и создать XML-документы правильные и неправильные в соответствии с разработанными определениями типа документов Корневой элемент library: 1) 2) 3) 4) library содержит элементы item (их может быть и пустое множество), каждый item содержит один элемент title и один элемент author в указанном порядке, элементы title и author содержат символьные данные library содержит элементы name (ровно один), address (один, но может отсутствовать), item (один есть всегда) в указанном порядке, каждый item содержит один элемент title и несколько элементов author (один есть всегда) в указанном порядке, элементы title, author, name и address содержат символьные данные library содержит элементы name (ровно один), address (один, но может отсутствовать), item (один есть всегда) в указанном порядке, каждый item содержит один элемент title, несколько элементов author (один есть всегда) и либо udk (ноль или один), либо bbk (ноль или один) в произвольном порядке, элементы title, author, name, address, udk, и bbk содержат символьные данные library содержит элементы name (ровно один), address (один, но может отсутствовать), item (один есть всегда) в указанном порядке, каждый item содержит один элемент title, несколько элементов author (один есть всегда) и либо udk (ноль или один), либо bbk (ноль или один) в произвольном порядке, элемент title содержит текст и элемент subtitle (смешанное содержимое), элементы author, name, address, udk, bbk и subtitle содержат символьные данные 8 Объявления элементов: задания 2 • Задание: дано объявление типа документа <!DOCTYPE BOOK [ <!ELEMENT p (#PCDATA)> <!ELEMENT BOOK (OPENER,SUBTITLE?,INTRODUCTION?,(SECTION | PART)+)> <!ELEMENT OPENER (TITLE_TEXT)*> <!ELEMENT TITLE_TEXT (#PCDATA)> <!ELEMENT SUBTITLE (#PCDATA)> <!ELEMENT INTRODUCTION (HEADER, p+)+> <!ELEMENT PART (HEADER, CHAPTER+)> <!ELEMENT SECTION (HEADER, p+)> <!ELEMENT HEADER (#PCDATA)> <!ELEMENT CHAPTER (CHAPTER_NUMBER, CHAPTER_TEXT)> <!ELEMENT CHAPTER_NUMBER (#PCDATA)> <!ELEMENT CHAPTER_TEXT (p)+> ]> Создать 2-3 правильных XML-документа и 2-3 неправильных 9 Объявления элементов: задания 3 • Задания: – Создать для номера 4 со слайда 8 внешнее DTD и подключить его к документу – В документе XML c внешним DTD (номер 4) внутри документа изменить объявление title как хранящее только символьные данные – В документе XML c внешним DTD (номер 4) убрать определение элемента title, а внутри документа определить его как содержащего и текст, и элемент subtitle с символьным содержимым 10 Сущности (1) • • Сущность можно определить как составляющий (физический) элемент XML-документа Сущности делятся на два типа: общие (используются внутри документа) и параметрические (используются в DTD) – Обращение в документе к сущности выполняется с помощью ссылок: &имя_сущн; - ссылка на общую сущность %имя_сущн; - ссылка на параметрическую сущность – XML-процессор заменяет сущность ее содержимым (обычно текстовые данные, но могут быть и в двоичной форме) • • Сущности могут быть внешние (в определении обязателен URI) и внутренние (полностью определяются в DTD) Сущности делятся на разбираемые и неразбираемые – Разбираемые заменяются на текст (внутренние – содержимое сущности после подстановки символьных ссылок и ссылок на параметрические сущности; внешние – содержимое сущности без подстановки символьных ссылок и ссылок на параметрические сущности (они заменяются непосредственно в документе), который может содержать маркировку – Неразбираемые заменяются на их содержимое, которое может быть как любым текстом (не обязательно XML), так и не текстом • Пять символьных сущностей предопредлены в XML (&lt; &gt; &amp; &quot; &apos;) 11 Общие сущности • • • • • Внутренние (всегда разбираемые) <!ENTITY имя определение> определение – строка, содержащая ссылки на другие общие или параметрические сущности <!ENTITY AUTHOR "S. Holzner"> <!ENTITY SIGNATURE "&AUTHOR; It's me"> Не допустимо зацикливание ссылок на сущности Внешние (разбираемые) <!ENTITY имя SYSTEM URI> <!ENTITY имя PUBLIC FPI URI> Файл должен иметь текстовое содержимое (возможно с разметкой) со ссылками на общие или параметрические сущности, которые разрешаются после подстановки в документ XML Внешние сущности позволяют формировать документ на основе отдельных частей <!DOCTYPE library [ ... <!ENTITY data SYSTEM "../ch04.xml"> ... ]> <library> &data; </library> 12 Параметрические сущности • • • • • ОГРАНИЧЕНИЕ: можно определять параметрические сущности и использовать ссылки на них только во внешних DTD Внутренние <!ENTITY % имя определение> определение – строка, содержащая ссылки на другие параметрические сущности, и которую можно использовать в DTD при определении содержимого в объявлениях элементов, сущностей и атрибутов <!ENTITY % content "title, name"> <!ELEMENT SIGNATURE (%content;, date)> Внешние <!ENTITY % имя SYSTEM URI> <!ENTITY % имя PUBLIC FPI URI> Используемая параметрическая сущность должна быть определена до ее использования Совместно с параметрическими сущностями используются директивы INCLUDE и IGNORE <![ INCLUDE [ ... ]]> <![ IGNORE [ ... ]]> <!ENTITY % draft 'INCLUDE' > <!ENTITY % final 'IGNORE' > <![%draft;[ <!ELEMENT book (comments*, title, body, supplements?)> ]]> <![%final;[ <!ELEMENT book (title, body, supplements?)> ]]> 13 Сущности: задания 1. Создать внутреннюю общую сущность (с разметкой и без нее, со ссылками на другие сущности и символьные ссылки) и использовать ее – – – – – 2. 3. 4. 5. 6. в определении другой внутренней сущности в циклическом определении двух сущностей в документе в качестве содержимого других элементов (с разметкой и без разметки) в секции CDATA (с разметкой и без разметки) Использовать сущность в определении какого-либо элемента в DTD Создать внутреннюю общую сущность, не удовлетворяющую продукции content элемента XML и использовать ее в документе Сделать задание 1, но с внешними общими сущностями Создать параметрическую сущность во встроенном DTD и использовать ее для определения элемента Поработать с внутренними и внешними сущностями, определяя часто используемые (или в последствии заменяемые) в определении других элементов группы элементов Просмотреть и проанализировать DTD для HTML и XHTML с точки зрения использования параметрических сущностей 14 Атрибуты • • Для каждого элемента можно объявить список атрибутов <!ATTLIST имя_элемента имя_атрибута тип умалчиваемое_поведение имя_атрибута тип умалчиваемое_поведение . . . имя_атрибута тип умалчиваемое_поведение > Пример <?xml version="1.0" standalone="yes" encoding="UTF-8"?> <!DOCTYPE DOCUMENT [ <!ELEMENT DOCUMENT (GREETING, MESSAGE)> <!ELEMENT GREETING (#PCDATA)> <!ELEMENT MESSAGE (#PCDATA)> <!ATTLIST GREETING lang CDATA #REQUIRED type (text|audio|video) "text" hand (UP | DOWN) #IMPLIED> ]> <DOCUMENT> <GREETING lang="en" hand="UP">Hello From XML</GREETING> <MESSAGE>Добро пожаловать в мир XML.</MESSAGE> </DOCUMENT> 15 Атрибуты: умалчиваемое поведение • Умалчиваемое поведение – значение (в соответствии с типом) атрибут определен (указал его пользователь или нет) и имеет заданное значение, пользователь может его изменить, умалчиваемого значения нет <!ATTLIST GREETING lang CDATA "en"> – #REQUIRED атрибут обязателен, его значение задает пользователь, умалчиваемого значения нет <!ATTLIST GREETING lang CDATA #REQUIRED> – #IMPLIED атрибут не обязателен, а поэтому и нет значения по умолчанию <!ATTLIST GREETING lang CDATA #IMPLIED> – #FIXED атрибут определен и всегда имеет указанное после ключевого слова значение, пользователь не может его изменить (попытка выполнить это приведет к тому, что документ будет недействительным!) <!ATTLIST GREETING lang CDATA #FIXED "en"> 16 Атрибуты: типы (1) • CDATA – строка символьных данных (можно использовать ссылки на символьные и общие сущности (в значениях по умолчанию в DTD тоже)) <!ATTLIST GREETING lang CDATA "value &temp;"> • Перечисляемый тип не имеет ключевого слова, используется выражение списка значений (value1 | value2 | ... | valueN) <!ATTLIST GREETING lang (Yes | No) "No"> • NMTOKEN – лексема имени в XML (одна или больше букв, цифр, символов дефиса, подчеркивания, точки, двоеточия, не обязательно начинающаяся с буквы, подчеркивания или двоеточия, как простое имя) <!ATTLIST GREETING lang NMTOKEN "1:_."> • NMTOKENS – значения из нескольких лексем NMTOKEN, разделенных пробельными символами <!ATTLIST GREETING lang NMTOKENS "Alex Green"> • ID – атрибут с уникальным для всего документа значением (соответствует имени в XML) среди атрибутов этого типа (элемент может иметь ОДИН атрибут этого типа), назначается пользователем (поэтому #IMPLIED или #REQUIRED) <!ATTLIST GREETING lang ID #REQUIRED> • IDREF – значение атрибута типа ID некоторого элемента этого же документа (XML-процессор проверяет наличие в документе элемента с указанным значением атрибута типа ID) <!ATTLIST GREETING lang IDREF #REQUIRED> 17 Атрибуты: типы (2) • ENTITY – значение имени объявленной внешней неразбираемой сущности <!ENTITY img1 SYSTEM "pict.gif" NDATA GIF> <!NOTATION GIF SYSTEM "image/gif"> <!ATTLIST GREETING lang ENTITY "img1"> • ENTITIES – список имен объявленных внешних неразбираемых сущностей <!ENTITY img1 SYSTEM "pict1.gif" NDATA GIF> <!ENTITY img2 SYSTEM "pict2.gif" NDATA GIF> <!NOTATION GIF SYSTEM "image/gif"> <!ATTLIST GREETING lang ENTITY "img1 img2"> • NOTATION – перечисляемый тип, задающий список объявленных в DTD нотаций формата представления данных (MIME-типов), отличного от XML-кода <!NOTATION GIF SYSTEM "image/gif"> <!NOTATION JPG SYSTEM "image/jpeg"> <!ATTLIST GREETING lang NOTATION (GIF | JPG) "GIF"> 18 Внедрение данных отличного от XML формата • Внешние неразбираемые общие сущности <!ENTITY имя SYSTEM URI NDATA имя_нотации> <!ENTITY имя PUBLIC FPI URI NDATA имя_нотации> • Нотация задает имя формата данных неразбираемых внешних сущностей <!NOTATION имя SYSTEM MIME-тип> • <!ENTITY img1 SYSTEM "pict.gif" NDATA GIF> <!NOTATION GIF SYSTEM "image/gif"> • Двоичные данные включаются в XML-документ посредством внешних неразбираемых сущностей через атрибуты <!ATTLIST GREETING lang ENTITY "img1"> • XML-процессор не разбирает встраиваемую сущность, но часто производит проверку наличия внешнего файла 19 Атрибуты: задания • Создать атрибуты всех возможных типов для элемента <GREETING>, подкорректировать программу JavaScript из презентации xml01.ppt для отображения атрибутов этого элемента, и поприсваивать создаваемым атрибутам правильные и неправильные значения и посмотреть правильность документа, а также значения атрибутов • Отработать для себя методику включения в XML-документ двоичного содержимого с помощью неразбираемых внешних общих сущностей через атрибуты элементов 20