Технология Microsoft ADO .NET

Введение в XML

Разбить на страницы
Показывать лекцию целиком

Введение в XML

Что такое HTML?

Язык разметки гипертекста HTML (Hyper Text Markup Language) представляет собой определенный набор элементов, которые используются для создания web-страницы. Примерами таких элементов являются заголовки, абзацы, списки, таблицы. Запускаем блокнот и вводим следующий текст:

<HTML>
<HEAD>
<TITLE>Это пример простейшего HTML-документа</TITLE>
</HEAD>
<BODY BGCOLOR = LIGHTGREY>

Несколько примеров

<BR>
<B> Жирный текст </B>
<U>Подчеркнутый текст</U>
<S>Перечеркнутый текст</S>
<P>Абзац</P>
<BR>
<FONT COLOR = RED SIZE = 16 FACE = ARIAL> Красный </FONT> 
<BR>  
<FONT COLOR = YELLOW SIZE = 16
 FACE = TIMES NEW ROMAN> Желтый </FONT>
<BR>
<FONT COLOR = GREEN SIZE = 16
 FACE = VERDANA> Зеленый </FONT>
<BR>
<MARQUEE BGCOLOR = BLACK> 
<FONT COLOR = WHITE> Бегущая строка </FONT></MARQUEE>
</BODY>
</HTML>

Сохраняем текст, назвав документ "Пример HTML-документа". Открываем "Мой компьютер \ Сервис \ Свойства папки \ вкладка "Вид"" и в окне "Дополнительные параметры" снимаем галочку "Скрывать расширения для зарегистрированных типов файлов". Теперь на компьютере все файлы будут в своем названии содержать и тип: например, рисунки - .bmp или .jpeg, программы - .exe, а файл блокнота - "Пример HTML-документа.txt". Меняем расширение на "Пример HTML-документа.htm" и запускаем. Появляется браузер, в котором открывается созданная страница (рис. 10.1):

(рис 10.1) Готовая страница в Internet Explorer

В главном меню выбираем "Вид \ Просмотр НТМL-кода" - появляется блокнот, содержащий набранный текст (рис. 10.2, подписи были добавлены к графическому изображению):

(рис 10.2) Просмотр HTML-кода страницы

Обратите внимание на форматирование HTML-кода - браузер игнорирует пробелы, отступы и абзацы; для их вывода на страницу используются специальные элементы. Каждый элемент начинается с начального тега: текста, заключенного в угловые скобки (< >), который содержит имя элемента. В скобках указываются также дополнительные свойства (атрибуты) тега, например, серый фоновый цвет страницы определяет атрибут LIGHTGREY элемента BODY. Большинство элементов заканчиваются конечным тегом, в котором повторяется название элемента с символом косой черты(/), но другие могут оканчиваться иначе - например, тег <BR>. Элемент "содержание" представляет собой текст, расположенный между начальным и конечным тегами. Сами теги могут быть написаны прописными ( <BODY> ) или строчными буквами( <body> ) - в любом случае браузер отобразит страницу верно. Для формирования страницы были использованы следующие эл ементы (Таблица 10.1).

Некоторые HTML-элементы
HTML-элементОписание
<HTML></HTML> Ключевой элемент, текст внутри него и представляет код страницы
<HEAD></HEAD> "Голова", шапка страницы
<TITLE></TITLE> Заголовок, отображаемый браузером
<BODY></BODY> "Тело" страницы, ее содержимое
BGCOLOR Атрибут, задающий цвет заднего фона
<BR> Новая строка
<B></B> Жирный текст
<U></U> Подчеркнутый текст
<S></S> Перечеркнутый текст
<P></P> Абзац
<FONT></FONT> Оформление шрифта
COLOR Цвет
SIZE Размер
FACE Вид шрифта
<MARQUEE></MARQUEE> Бегущая строка

Набор HTML-элементов достаточно велик, но есть документы, которые не могут быть описаны на языке HTML. Это математические, химические формулы, музыкальные символы, иерархические структуры. При выводе содержимого из базы данных HTML представляет данные в виде таблиц, однако в нем нет возможности определения ключей таблиц для последующей сортировки, поиска и фильтрации данных.

Созданная HTML страничка элементарна, тем не менее в программном обеспечении к курсу вы ее найдете. (Code\Glava5\ Пример HTML-документа.htm).

SGML, HTML и XML

Обобщенный структурированный язык разметки (Structured Generalized Language - SGML) представляет собой основу всех языков разметки. SGML не только определяет базовый синтаксис, но дает вам возможность создавать собственные элементы. Для создания описания документа на SGML нужно продумать соответствующий набор элементов и структуру документа.

Набор наиболее употребительных элементов, используемых для описания документа определенного типа, называется SGML-приложением. Если встроить в программу обработку этих элементов и последующую их интерпретацию, получится браузер. Язык HTML и представляет SGML-пpилoжeниe, разработанное в 1991 г. для описания web-страниц, для которого были созданы различные обозреватели - Internet Explorer, Netscape Navigator, Opera.

Разработчики из консорциума World Wide Web Consortium (W3C) сочли язык SGML слишком сложным и фундаментальным для представления информации в Интернете. Гибкость и большое обилие средств, поддерживаемых SGML, затрудняет написание программного обеспечения, необходимого для обработки и отображения SGML-информации в web-браузерах. Язык HTML, использующийся вплоть до настоящего времени, справляется со своей основной задачей, однако он не реализует в полной мере мощных функциональных возможностей SGML. В 1996 г. группа XML Working Group разработала ветвь языка SGML, назвав его расширяемым языком разметки - Extensible Markup Language.

XML является упрощенной версией SGML, приспособленной для Web. При разработке XML-документа вместо использования ограниченного набора определенных элементов можно создавать свои собственные элементы и присваивать им любые имена - именно поэтому язык XML называется расширяемым (extensible). Следовательно, XML пригоден для описания практически любого документа, от математических уравнений до базы данных. Синтаксис XML более простой, чем SGML, что облегчает восприятие XML-документов, а также написание программ браузеров, кодов и Web-страниц для доступа и представления информации документа.

Создание XML-документа

Приступим к созданию XML-документа. В качестве структуры, которую мы будем описывать, возьмем таблицу "Туры базы данных" - BDTur_firm.mdb, - с которой мы начали работать еще в первой лекции. Для создания документа запускаем Microsoft Visual Studio .NET, выбираем "File \ New \ File" (или используем сочетание клавиш Ctrl+N) и в списке шаблонов выбираем XML File (рис. 10.3):

(рис 10.3) Создание XML-документа

Конечно, XML-документ, так же как и HTML-документ, можно формировать и в блокноте, но подсветка синтаксиса значительно ускорит работу. Сохраняем появившейся документ, называя его XMLTour.xml. В новом документе есть всего одна строчка:

<?xml version="1.0" encoding="utf-8" ?>

В первой строке происходит объявление XML, указывающее на то, что это XML-документ, и содержащее номер версии. Объявление XML не является обязательным, хотя спецификация требует его включения. Если вы включаете XML-объявление, оно должно находиться в начале документа. Далее указывается кодировка документа - utf-8. Аналогично, если вы создадите HTML-страницу, выбрав соответствующий шаблон (см. рис. 10.3), в шаблоне будет указываться дополнительная информация, такая как версия языка HTML 4.0, язык EN, пакет верстки - Microsoft Visual Studio .NET 7.1 и другие:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title></title>
<meta name="GENERATOR" content="Microsoft Visual Studio
 .NET 7.1">
<meta name="vs_targetSchema"
 content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body>

</body>
</html>

Возвращаемся к нашему XML-документу и вводим комментарий - он начинается с символа "!--" и заканчивается символом "--":

<!-- Название файла XMLTour.xml -->

Определяем так называемый элемент "Документ", или корневой элемент. Поскольку у нас таблиц несколько, логично будет назвать его TABLE:

<TABLE></TABLE>

При завершении написания начального тега среда автоматически вставляет конечный тег. Внутри корневого элемента определяем вложенные элементы:

<TABLE>
	<TOUR>
		<IDTOUR></IDTOUR>
		<NAME></NAME>
		<PRICE></PRICE>
		<INFORMATION></INFORMATION>
	</TOUR>
 </TABLE>

Все! По сути, мы создали таблицу - переключаемся на вкладку( Data ) и вносим данные (рис. 10.4):

Переключаемся в режим XML, для чего нажимаем соответствующую кнопку(рис 10.4) и видим сформированный документ:

<?xml version="1.0" encoding="utf-8" ?>
<!-- Название файла XMLTour.xml -->
<TABLE>
	<TOUR>
		<IDTOUR>1</IDTOUR>
		<NAME>Кипр</NAME>
		<PRICE>25 000,00р. </PRICE>
		<INFORMATION>В стоимость двух взрослых
		 путевок входит цена одной детской (до 7лет)</INFORMATION>
	</TOUR>
	<TOUR>
		<IDTOUR>2</IDTOUR>
		<NAME>Греция</NAME>
		<PRICE>32 000,00р. </PRICE>
		<INFORMATION>В августе и сентябре
		 действуют специальные скидки</INFORMATION>
	</TOUR>
	<TOUR>
		<IDTOUR>3</IDTOUR>
		<NAME>Таиланд</NAME>
		<PRICE>30 000,00р.</PRICE>
		<INFORMATION>Не включая
		 стоимость авиабилета</INFORMATION>
	</TOUR>
	<TOUR>
		<IDTOUR>4</IDTOUR>
		<NAME>Италия</NAME>
		<PRICE>26 000,00р.</PRICE>
		<INFORMATION>Завтрак в отеле
		 включен в стоимость путевки</INFORMATION>
	</TOUR>
	<TOUR>
		<IDTOUR>5</IDTOUR>
		<NAME>Франция</NAME>
		<PRICE>27 000,00р.</PRICE>
		<INFORMATION>Дополнительные экскурсии
		 не входят в стоимость путевки</INFORMATION>
	</TOUR>
</TABLE>

Среда Visual Studio .NET облегчает работу по созданию XML-документов, подобно тому, как WYSIWYGWYSIWYG - "What You See Is What You Get" - "Что видишь, то и получаешь". редакторы HTML-кода помогают создавать web-страницы. Сохраним страницу и откроем ее в браузере - можно изменять степень детализации представления документа, щелкая на знаки плюс "+" и минус "-" (рис. 10.5):

(рис 10.5) Просмотр файла XMLTour.xml в Internet Explorer

В программном обеспечении к курсу вы найдете документ XMLTour.xml (Code\Glava5\ XMLTour.xml).

Структура XML-документа

Созданный нами документ состоит из двух основных частей - пролога и корневого элемента (элемента "Документ") (рис. 10.6).

(рис 10.6) Структура документа XML

Пролог может иметь необязательные компоненты, такие как тип и структура документа, инструкции по обработке приложения. Далее мы будем встречать эти компоненты. Корневой элемент представляет собой основу всего элемента и состоит из начального тега, конечного тега и содержимого. В качестве содержимого могут быть данные (текст), другие теги (вложенные элементы) или их сочетание. В рассматриваемом документе корневой элемент - TABLE. Его начальный тег - <TABLE>, конечный - </TABLE>, а содержимое - пять вложенных элементов <TOUR>. Каждый элемент Tour в свою очередь состоит из группы вложенных элементов (рис. 10.7).

(рис 10.7) Структура элемента

Каждый тег, входящий в элемент TOUR, представляет собой простейшую структуру (рис. 10.8).

(рис 10.8) Структура тега

Структура в точности такая же, как и у элементов HTML, только названия элементов определены, а в тегах XML тип задается пользователем.

Понятие корректно сформированных (well-formed) XML-документов

Документ называется корректно сформированным, если он соответствует минимальному набору правил для XML-документов:

  • XML-документ должен иметь только один корневой элемент (элемент "Документ"). Все другие элементы должны быть вложены в корневой элемент.
  • Элементы должны быть вложены упорядоченным образом. Если элемент начинается внутри другого элемента, он должен и заканчиваться внутри этого элемента.
  • Каждый элемент должен иметь начальный и конечный теги. В отличие от HTML, в XML не разрешается опускать конечный тег - даже в том случае, когда браузер в состоянии определить, где заканчивается элемент.
  • Название элемента в начальном теге должно в точности соответствовать (с учетом регистра) названию в соответствующем конечном теге.
  • Название элемента должно начинаться с буквы или с символа подчеркивания ( _ ), после чего могут идти буквы, цифры, символы точки (.), тире (-) или подчеркивания.
  • Это базовые критерии корректного формирования. Для других понятий языка XML (атрибутов, примитивов, связей) действуют свои правила, которые необходимо соблюдать. Можно сказать, что если документ создан правильно, верно и при его отображении и использовании не возникает никаких ошибок, то это и есть корректно сформированный документ. Если вы ошибетесь в каком-либо теге HTML-страницы, браузер просто проигнорирует соответствующий тег, а ошибка в теге XML сделает невозможным отображение страницы. В этом смысле написание XML похоже на программирование на C# - компилятор не запустит программу при наличии синтаксических ошибок. При наличии одной из ошибок встроенный в Internet Explorer анализатор (его иногда называют XML-процессор или парсер) определяет ее позицию (таблица 10.2).

    Ошибки формирования XML-документов
    ОшибкаОписание
    1
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла
     XMLTour.xml  -->
    <TABLE>
    :
    </TABLE>
    <TABLE2>
    </TABLE2>
    В документе находится два корневых элемента
    Результат в Internet Explorer
    2
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла
     XMLTour.xml  -->
    <TABLE>
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых путевок
     входит цена одной детской
     (до 7лет)</TOUR>
    </INFORMATION>
    :
    </TABLE>
    Тег INFORMATION начинается внутри тега TOUR, а заканчивается снаружи

    Правильная структура:

    <TOUR>
    <INFORMATION>
    </INFORMATION>
    </TOUR>

    Неправильная:

    <TOUR>
    <INFORMATION>
    </TOUR>
    </INFORMATION>
    Результат в Internet Explorer
    3
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла
     XMLTour.xml  -->
    <TABLE>
    <TOUR>
    <IDTOUR>1
    :
    </TOUR>
    :
    </TABLE>
    Нет конечного тега IDTOUR
    Результат в Internet Explorer
    4
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла
     XMLTour.xml  -->
    <TABLE>
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</name>
    :
    </TOUR>
    :
    </TABLE>
    Регистр начального и конечного тега не совпадают
    Результат в Internet Explorer
    5
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла
     XMLTour.xml  -->
    <TABLE>
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <1PRICE>25 000,00р. </PRICE>
    :
    </TOUR>
    :
    </TABLE>
    Название элемента 1PRICE начинается с цифры
    Результат в Internet Explorer

    В программном обеспечении к курсу вы найдете папку "Ошибки_XML", в которой находятся рассмотренные документы XML с ошибками (Code\Glava5\Ошибки_XML).

    Что такое каскадные таблицы стилей (CSS)?

    Для определения свойств текста в HTML-документе, таких как размер шрифта, стиль, начертание, цвет, используются атрибуты тегов, в которых указываются нужные параметры. Для нескольких небольших страничек с уникальным дизайном применение атрибутов, относящихся к дизайну, вполне оправданно. Для крупных проектов, например, электронного журнала или портала новостей, где требуется соблюдать одинаковое оформление и иметь возможность быстро его заменять, возникает идея отделить содержимое страницы от его оформления. Это можно сделать с помощью таблиц каскадных стилей (Cascade Style Sheets, CSS). Для присвоения какому-либо элементу определенных характеристик необходимо один раз описать этот элемент и определить это описание как стиль, а в дальнейшем просто указывать, что элемент, который нужно оформить соответствующим образом, должен принять свойства описанного стиля. Эта концепция позволяет также сократить размер страницы - вместо многократного повторения заданного атрибута получаем всего лишь одно описание его стиля.

    В название таблицы стилей включено определение "каскадные", поскольку возможно использование нескольких таблиц стилей для форматирования одного документа HTML, а браузер по определенным правилам выстраивает приоритетность выполнения этих таблиц. Они выстраиваются своеобразным "каскадом", по которому обрабатывается документ.

    Существует четыре основных способа связывания HTML-документа и таблицы стилей.

  • Связывание - одна таблица стилей используется для форматирования нескольких страниц.
  • Внедрение - все правила таблицы стилей задаются непосредственно в самом документе.
  • Встраивание в теги документа - изменяется форматирование конкретных элементов страницы.
  • Импортирование - в один или несколько документов встраивается таблица стилей, расположенная на сервере.
  • Рассмотрим каждый из этих способов в отдельности.

  • Связывание

    Запускаем Visual Studio .NET и создаем три HTML-страницы (см. рис. 10.3, шаблон HTML-Page), которые называем 1, 2 и 3. Затем создаем файл MyStyle.css, для которого выбираем шаблон Style Sheet (см. рис. 10.3). Сохраняем все эти файлы в одну папку, которую называем "Связывание". Содержимое и вид страниц после запуска приводится в таблице 10.3.

    Применение CSS: связывание
    Название файла Содержимое Вид в Internet Explorer
    1.htm
    <html>
    <head>
    <title>Первая страница</title>
    <LINK REL=STYLESHEET
     TYPE="text/css"
     HREF="MyStyle.css"></LINK>
    </head>
    <body>
    <h1>Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    </body>
    </html>
    2.htm
    <html>
    <head>
    <title>Вторая страница</title>
    <LINK REL=STYLESHEET
     TYPE="text/css"
     HREF="MyStyle.css"></LINK>
    </head>
    <body>
    <h4>Четвертый заголовок</h4>
    <h5>Пятый заголовок</h5>
    <h6>Шестой заголовок</h6>
    </body>
    </html>
    3.htm
    <html>
    <head>
    <title>Третья страница</title>
    <LINK REL=STYLESHEET
     TYPE="text/css"
     HREF="MyStyle.css"></LINK>
    </head>
    <body>
    <h1>Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    <h4>Четвертый заголовок</h4>
    <h5>Пятый заголовок</h5>
    <h6>Шестой заголовок</h6>
    </body>
    </html>
    MyStyle.css
    BODY
    {background: Dodgerblue
    }
    H1{font-family:Arial; color:Red;
     font-size:medium}
    H2{font-family:Bookman Old Style;
     color:Orangered; font-size:medium}
    H3{font-family:Comic Sans MS;
     color:Yellow; font-size:medium}
    H4{font-family:Courier New;
     color:Lime; font-size:medium}
    H5{font-family:Times New Roman;
     color:Mediumblue; font-size:medium}
    H6{font-family:Verdana;
     color:Darkviolet; font-size:medium}

    Элементы h1, h2, ..., h6 используются для создания заголовков текста. Без применения стиля самый крупный заголовок - h1, самый мелкий - h6.

    Итак, в самих документах нет описания того, как должны выглядеть страницы. Вместо этого во всех трех страницах есть инструкция, указывающая на файл MyStyle.css:

    <LINK REL=STYLESHEET TYPE="text/css"
     HREF="MyStyle.css"></LINK>

    Первые два параметра этого тега являются зарезервированными именами, требующимися для того, чтобы сообщить браузеру, что на этой страничке будет использоваться CSS. Третий параметр - HREF= "URL" - указывает на файл, который содержит описания стилей. Этот параметр должен содержать либо относительный путь к файлу - в случае если он находится на том же сервере, что и документ, из которого к нему обращаются, - либо полный URL ("http://...") в случае если файл стилей находится на другом сервере.

    Файл MyStyle.css не выводится бразуером - в нем хранится лишь описание стилей. В рассматриваемом примере элементу BODY, отвечающему за содержимое страницы, устанавливается значение фонового цвета Dodgerblue:

    BODY {background: Dodgerblue}

    Вначале указывается название элемента ( BODY ), затем атрибут ( background ) со значением после двоеточия ( Dodgerblue ).

    Аналогичная конструкция, задающая значение фонового цвета в виде атрибута, будет иметь следующий вид:

    <body bgcolor="Dodgerblue">
    </body>

    При описании нескольких свойств они разделяются точкой с запятой:

    H1{font-family:Arial; color:Red; font-size:medium}

    Простое задание атрибутов элемента H1 выглядит так:

    <h1><font family="Arial" color="Red"
     size="medium">Первый заголовок<font></h1>

    Вы могли заметить, что названия элементов я иногда писал прописными буквами ( H1 ), а иногда строчными ( h1 ). Для HTML это допустимо (для XML - нет) - браузеры правильно интерпретируют описание в обоих случаях. Также я указывал значения атрибутов иногда в кавычках ( bgcolor="Dodgerblue" ) а иногда - нет ( bgcolor = lightgrey ). Опять-таки, при работе с HTML-документами так делать можно, при работе с XML - нет (все значения атрибутов должны указываться в кавычках, см. далее).

    При создании таблицы каскадных стилей некоторые свойства отличаются от аналогичных атрибутов - сравните названия "background" и "bgcolor". Сориентироваться при создании таблицы стилей вам помогут всплывающие подсказки Visual Studio .NET (рис. 10.9) и собственный опыт.

    (рис 10.9) Всплывающая подсказка Visual Studio .NET при работе с шаблоном Style Sheet

    В программном обеспечении к курсу вы найдете папку "Связывание" с рассмотренными документами (Code\Glava5\CSS\Связывание).

  • Внедрение

    Другой способ использования CSS - внедрение описания стилей в сам документ. Создадим новую папку, назовем ее "Внедрение" и изменим страницы 1, 2 и 3 следующим образом (таблица 10.4):

    Применение CSS: внедрение
    Название файлаСодержимое
    1.htm
    <html>
    <head>
    <title>Первая страница</title>
    <STYLE TYPE="text/css">
    <!-- body {background: Dodgerblue } 
    H1{font-family:Arial; color:Red; font-size:medium}
    H2{font-family:Bookman Old Style; color:Orangered;
     font-size:medium} 
    H3{font-family:Comic Sans MS; color:Yellow; 
    font-size:medium} 
    --> </STYLE>
    </head>
    <body>
    <h1>Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    </body>
    </html>
    2.htm
    <html>
    <head>
    <title>Вторая страница</title>
    <STYLE TYPE="text/css">
    <!-- body {background: Dodgerblue } 
    H4{font-family:Courier New; color:Lime;
     font-size:medium} 
    H5{font-family:Times New Roman;
     color:Mediumblue; font-size:medium} 
    H6{font-family:Verdana; color:Darkviolet;
     font-size:medium} 
    --> </STYLE>
    </head>
    <body>
    <h4>Четвертый заголовок</h4>
    <h5>Пятый заголовок</h5>
    <h6>Шестой заголовок</h6>
    </body>
    </html>
    3.htm
    <html>
    <head>
    <title>Третья страница</title>
    <STYLE TYPE="text/css">
    <!-- body {background: Dodgerblue } 
    H1{font-family:Arial; color:Red;
     font-size:medium} 
    H2{font-family:Bookman Old Style;
     color:Orangered; font-size:medium}
    H3{font-family:Comic Sans MS;
     color:Yellow; font-size:medium} 
    H4{font-family:Courier New;
     color:Lime; font-size:medium}
    H5{font-family:Times New Roman;
     color:Mediumblue; font-size:medium} 
    H6{font-family:Verdana;
     color:Darkviolet; font-size:medium} 
    --> </STYLE>
    </head>
    <body>
    <h1>Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    <h4>Четвертый заголовок</h4>
    <h5>Пятый заголовок</h5>
    <h6>Шестой заголовок</h6>
    </body>
    </html>

    При запуске этих страниц их внешний вид не изменится, поскольку мы оставили стили страниц прежними. Описание располагается внутри тега STYLE:

    <STYLE type="text/css">... </STYLE>.

    Сама конструкция окружена символами комментария:

    <!-- _-->

    Несмотря на то, что подавляющее большинство браузеров поддерживает CSS, всегда следует учитывать обратную возможность - в этом случае знаки комментария позволят проигнорировать описание и избежать ошибки.

    В программном обеспечении к курсу вы найдете папку "Внедрение" с рассмотренными документами (Code\Glava5\CSS\Внедрение).

  • Встраивание в теги документа

    Третий вариант, когда описание стиля располагается непосредственно внутри тега описываемого элемента при помощи атрибута STYLE . Этот метод нежелателен, он приводит к потере одного из основных преимуществ CSS - возможности отделения информации от описания оформления информации. Впрочем, если необходимо описать лишь один элемент, этот вариант расположения описания стилей также вполне применим. Создадим новую папку и назовем ее "Встраивание". Скопируем в нее файлы 1.htm и MyStyle.css из папки "Связывание". Теперь у нас есть HTML-документ со связанной таблицей стилей. Сделаем копию документа 1.htm и назовем ее Встраивание1.htm. Изменим HTML-код этого документа:

    <html>
    <head>
    <title>Первая страница</title>
    <LINK REL=STYLESHEET TYPE="text/css"
     HREF="MyStyle.css"></LINK>
    </head>
    <body>
    <h1 STYLE="font-family:Comic Sans MS; color:Indigo; 
    font-size:xx-large">Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    </body>
    </html>

    Таблица стилей по-прежнему работает для этого документа, но описание тега h1 имеет больший приоритет (рис. 10.10):

    (рис 10.10) Встраивание стиля в тег документа (сравните с табл. 10.3)

    В программном обеспечении к курсу вы найдете папку "Встраивание" с рассмотренными документами (Code\Glava5\CSS\Внедрение).

  • Импортирование

    Последний способ применения CSS - импорт внешней таблицы стилей (расположенной на сервере) с помощью свойства @import:

    <html>
    <head>
    <title>Первая страница</title>
    <STYLE>
    @import:url(http://somename.ru/MyStyle.css)
    </STYLE>
    </head>
    <body>
    <h1>Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    </body>
    </html>
  • Применение CSS для представления XML

    При просмотре документа XMLTour.xml в браузере была представлена определенная структура, однако его внешний вид напоминает скорее внутренний HTML-код web-страницы, чем готовый документ. Дело в том, что мы создали свой набор элементов, и браузер не имеет встроенных средств, позволяющих определить, как его надо отобразить. Создание таблицы каскадных стилей и связывание ее с XML-документом - это один из способов сообщить браузеру, как отображать каждый из элементов документа.

    Хранение инструкций по отображению в таблице стилей отдельно от самого XML-документа повышает гибкость XML-документа и облегчает работу с ним. Можно быстро адаптировать один XML-документ к различным условиям отображения (различным браузерам, приложениям, контекстным ситуациям) простым присоединением соответствующей таблицы стилей, без необходимости изменения самого документа.

    Мы рассмотрим один из способов связи XML с CSS. Создадим новую папку и назовем ее CSSXML. Скопируем в нее документ XMLTour.xml и MyStyle.css. Во избежание путаницы переименуем MyStyle.css в CSSTour.css, затем откроем этот файл и изменим содержимое следующим образом:

    TABLE{display:block; font-family:Arial; color:Red; font-size:medium}

    В XML-документе элемент TABLE - корневой. Открываем XMLTour.xml и указываем связь с таблицей стилей:

    <?xml version="1.0" encoding="utf-8" ?>
    
    <!-- Название файла XMLTour.xml -->
    <?xml-stylesheet type="text/css" href="CSSTour.css"?> 
    <TABLE>
    ...
    </TABLE>

    Просматриваем документ в браузере - все дочерние элементы приняли свойства корневого (рис. 10.11):

    (рис 10.11) Просмотр XMLTour.xml с таблицей стилей

    Для указания свойств дочерних элементов необходимо указать их описание в таблице стилей. Сделаем копии файлов XMLTour.xml и CSSTour.css и назовем их XMLTour2.xml и CSSTour2.css соответственно. В таблице стилей зададим описание для всех элементов:

    TABLE{display:block; font-family:Arial; color:Red; 
    font-size:medium}
    TOUR{font-family:Bookman Old Style; color:Orangered; 
    font-size:medium}
    IDTOUR{font-family:Comic Sans MS; color:Yellow; font-size:medium}
    NAME{font-family:Courier New; color:Lime; font-size:medium}
    PRICE{font-family:Times New Roman; color:Mediumblue; 
    font-size:medium}
    INFORMATION{font-family:Verdana; color:Darkviolet; font-size:medium}

    В файле XMLTour2.xml изменим связь:

    ...
    <?xml-stylesheet type="text/css" href="CSSTour2.css"?> 
    ...

    Теперь каждый элемент имеет свое описание (рис. 10.12):

    (рис 10.12) Применение стиля к каждому элементу XMLTour2.xml

    Определение собственных стилей имеет больший приоритет перед описанием корневого элемента. Поскольку в рассматриваемом случае теги TABLE и TOUR не содержат символьных данных, их определение можно опустить, и тогда эквивалентная таблица стилей примет вид

    IDTOUR{font-family:Comic Sans MS; color:Yellow; font-size:medium}
    NAME{font-family:Courier New; color:Lime; font-size:medium}
    PRICE{font-family:Times New Roman; color:Mediumblue; 
    font-size:medium}
    INFORMATION{font-family:Verdana; color:Darkviolet; 
    font-size:medium}

    Таблица стилей состоит из одного или нескольких правил (иногда их называют набором правил). Правило содержит информацию по отображению определенного типа элемента в XML-документе. Селектор представляет собой имя типа элемента, к которому относится информация по отображению (рис. 10.13):

    (рис 10.13) Структура правила таблицы стилей

    За селектором следует блок объявлений, который ограничивается фигурными скобками ({}) и содержит одно или несколько объявлений, разделяемых точкой с запятой.

    Каждое объявление задает установку определенного свойства, такого как размер шрифта, который будет использован для отображения элемента. Объявление состоит из свойства, вслед за которым идет двоеточие, и затем следует значение для данного свойства (рис. 10.14):

    (рис 10.14) Структура объявления

    Таблица каскадных стилей позволяет управлять способами форматирования содержимого элементов в XML-документах, но она не дает возможности изменять или реорганизовывать само содержимое. Она также не позволяет осуществлять доступ к компонентам XML и не дает возможности обрабатывать информацию, которую эти компоненты содержат.

    В программном обеспечении к курсу вы найдете папку "CSSXML" с рассмотренными документами (Code\Glava5\ CSSXML).

    Создание действительных (valid) XML-документов. Определение типа документа (DTD)

    Любой XML-документ должен отвечать минимальным требованиям по составлению, т.е. быть корректно сформированным. Если документ содержит ошибки, он не может считаться XML-документом.

    Корректно сформированный XML-документ также может быть действительным ( valid ). Действительным называется корректно сформированный ( well-formed ) документ, отвечающий двум дополнительным требованиямСреда Microsoft Visual Studio.NET не содержит встроенных средств для проверки документа на действительность. Для этого можно использовать специализированные xml-редакторы, например, <oXygen/> (http://www.oxygenxml.com/).:

  • Пролог документа должен содержать специальное объявление типа документа, которое включает определение типа документа ( Data Type Definition, DTD ), задающее структуру документа.
  • Корневой элемент должен отвечать структуре, заданной в DTD.
  • Использование критерия действительности необходимо для включения XML-документа в группу схожих документов, отвечающих определенной структуре или набору стандартов. Достаточно один раз выработать схему DTD и затем просто подключать ее к создаваемым документам. Стандарт XML определяет DTD как "грамматику для определенного класса документов".

    Объявление типа документа представляет собой блок XML-разметки, который располагается в любом месте пролога корректно сформированного документа. Оно имеет следующую обобщенную форму записи:

    <!DOCTYPE Название_корневого_элемента DTD>

    DTD представляет собой определение типа документа. Оно состоит из символа левой квадратной скобки ([), после которой следует ряд объявлений разметки, заканчивающихся правой квадратной скобкой (]). Объявления разметки описывают логическую структуру документа, т.е. задают элементы документа, атрибуты и другие компоненты. Действительный XML-документ, содержащий DTD с единственным объявлением разметки, которое определяет один тип элемента в документе, TABLE, выглядит так (рис. 10.15).

    (рис 10.15) Простейший документ с DTD

    В этом примере DTD документа указывает, что он может содержать только элементы типа TABLE (это единственный заданный тип элемента) и что элемент TABLE может иметь любое допустимое для данного типа содержимое (ключевое слово ANY).

    DTD может содержать различные типы объявлений разметки: объявления типов документов, объявления типов атрибутов, инструкции по обработке и другие. Объявление типа элемента имеет следующую обобщенную форму:

    <!ELEMENT Название_элемента описание_содержимого>

    Некоторые возможные описания содержимого приведены в таблице 10.5.

    Объявления содержимого документа
    ШаблонОписание
    1
    <!ELEMENT Название_элемента
     (#PCDATA)>
    Элемент TABLE может содержать только символьные данные, дочерние элементы не допускаются
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?> 
    <!DOCTYPE TABLE [<!ELEMENT TABLE
     (#PCDATA)>] >
    <TABLE>Простейший документ</TABLE>
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE (#PCDATA)>] >
    <TABLE>
    <TOUR></TOUR>
    Простейший документ
    </TABLE>
    2
    <!ELEMENT Название_элемента
     ANY>
    Элемент TABLE может содержать любые данные. Объявлять тип элемента в документе можно только один раз.
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE ANY>] >
    <TABLE>
    <TOUR></TOUR>
    Простейший документ
    </TABLE>
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE ANY>] >
    [<!ELEMENT TABLE (#PCDATA)>] >
    <TABLE>
    <TOUR></TOUR>
    Простейший документ
    </TABLE>
    3
    <!ELEMENT Название_элемента
     (Название_дочернего_элемента)+>
    Элемент TABLE может содержать один или несколько элементов TOUR
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE (TOUR)+>] >
    <TABLE>
    <TOUR>Кипр</TOUR>
    <TOUR>Греция</TOUR>
    <TOUR>Таиланд</TOUR>
    <TOUR>Италия</TOUR>
    </TABLE>
    4
    <!ELEMENT Название_элемента
     EMPTY>
    Элемент TABLE должен быть пустым, т.е. не иметь содержимого
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE EMPTY>] >
    <TABLE>
    </TABLE>
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE EMPTY>] >
    <TABLE> Простейший документ
    </TABLE>

    При создании документа XMLTour.xml мы определили элемент TOUR, который содержит дочерние элементы в следующей последовательности: IDTOUR, NAME, PRICE и INFORMATION. Далее, при заполнении списка туров для нас важно осуществлять проверку расположения элементов - дочерние элементы должны располагаться только так. В таблице 10.6 рассмотрены некоторые типичные примеры определения расположения дочерних элементов.

    Примеры описания структуры элемента
    ШаблонОписание
    1
    <!ELEMENT Название_элемента
     (Название_первого_дочернего_элемента,
     название_второго_дочернего_элемента,
     название_третьего_дочернего_элемента,:,
     название_n-ного_дочернего_элемента)>
    Последовательная форма модели содержимого указывает, что элемент должен иметь заданную последовательность дочерних элементов. Имена типов дочерних элементов отделяются запятыми. Пропуск дочернего элемента или использование одного и того же типа дочернего элемента более одного раза также недопустимо
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TOUR 
    [
    <!ELEMENT TOUR (IDTOUR, NAME,
     PRICE, INFORMATION)>
    <!ELEMENT IDTOUR (#PCDATA)> 
    <!ELEMENT NAME (#PCDATA)>  
    <!ELEMENT PRICE (#PCDATA)> 
    <!ELEMENT INFORMATION (#PCDATA)> 
    ] >
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых
     путевок входит цена
     одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TOUR 
    [
    <!ELEMENT TOUR (IDTOUR, NAME,
     PRICE, INFORMATION)>
    <!ELEMENT IDTOUR (#PCDATA)> 
    <!ELEMENT NAME (#PCDATA)>  
    <!ELEMENT PRICE (#PCDATA)> 
    <!ELEMENT INFORMATION (#PCDATA)> 
    ] >
    <TOUR>
    <NAME>Кипр</NAME>
    <IDTOUR>1</IDTOUR>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых
     путевок входит цена
     одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
    2
    <!ELEMENT Название_элемента
     (Название_первого_дочернего_элемента |
     название_второго_дочернего_элемента |
     название_третьего_дочернего_элемента |:|
     название_n-ного_дочернего_элемента)>
    Выборочная форма модели содержимого указывает, что элемент может иметь один любой из серии допустимых дочерних элементов, разделяемых символом "|"
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TOUR 
    [
    <!ELEMENT TOUR (IDTOUR | NAME |
     PRICE | INFORMATION)>
    <!ELEMENT IDTOUR (#PCDATA)> 
    <!ELEMENT NAME (#PCDATA)>  
    <!ELEMENT PRICE (#PCDATA)> 
    <!ELEMENT INFORMATION (#PCDATA)> 
    ] >
    Правильные варианты:
  • <TOUR>
    <IDTOUR>1</IDTOUR>
    </TOUR>
  • <TOUR>
    <NAME>Кипр</NAME>
    </TOUR>
  • <TOUR>
    <PRICE>25 000,00р. </PRICE>
    </TOUR>
  • <TOUR>
    <INFORMATION>В стоимость
     двух взрослых
     путевок входит цена
     одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
  • <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TOUR 
    [
    <!ELEMENT TOUR (IDTOUR | NAME |
     PRICE | INFORMATION)>
    <!ELEMENT IDTOUR (#PCDATA)> 
    <!ELEMENT NAME (#PCDATA)>  
    <!ELEMENT PRICE (#PCDATA)> 
    <!ELEMENT INFORMATION (#PCDATA)> 
    ] >
    Неправильные варианты:
  • <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    
    </TOUR>
  • <TOUR>
    <NAME>Кипр</NAME>
    <IDTOUR>1</IDTOUR>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых
     путевок входит цена
     одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
  • Рассмотренные модели содержимого можно дополнять следующими знаками:

    + - один или несколько элементов;

    * - ни одного или несколько элементов;

    ? - ни одного или один элемент.

    Следующее объявление означает, что документ может содержать один или несколько элементов NAME и что элемент INFORMATION может не существовать или быть в единственном экземпляре:

    ...
    <!ELEMENT TOUR (IDTOUR, NAME+, PRICE, INFORMATION?)>
    ...
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <NAME>Греция(включая Кипр)</NAME>
    <PRICE>25 000,00р. </PRICE>
    </TOUR>

    Другое объявление означает, что документ может содержать ни одного или несколько элементов IDTOUR, либо элемент NAME, либо элемент PRICE, либо ни одного или один элемент INFORMATION:

    ...
    <!ELEMENT TOUR (IDTOUR* | NAME| PRICE | INFORMATION?)>
    ...

    Соответствующие правильные три варианта выглядят следующим образом:

    <TOUR>
    <IDTOUR>1</IDTOUR>
    <IDTOUR>2</IDTOUR>
    </TOUR>
    
    <TOUR>
    <NAME>Кипр</NAME>
    </TOUR>
    
    <TOUR>
    </TOUR>

    Указанные модели и символы поддерживают сложные образования, образуемые вложением последовательной модели содержимого в выборочную, и наоборот. Примером такого сложного образования может служить следующее объявление:

    <!DOCTYPE TOUR 
    [ 
    <!ELEMENT TOUR (IDTOUR, NAME, (PRICE_EURO | PRICE_DOLLAR | PRICE_RUB) )> 
    <!ELEMENT IDTOUR (#PCDATA)> 
    <!ELEMENT NAME (#PCDATA)> 
    <!ELEMENT PRICE_EURO (#PCDATA)> 
    <!ELEMENT PRICE_DOLLAR (#PCDATA)> 
    <!ELEMENT PRICE_RUB (#PCDATA)> 
    ] >

    Для него будут верными следующие варианты корневого элемента:

  • <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE_RUB>25 000,00р. </PRICE_RUB>
    </TOUR>
  • <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE_DOLLAR>1000$. </PRICE_DOLLAR>
    </TOUR>
  • <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE_EURO>760 _. </PRICE_EURO>
    </TOUR>
  • XSL и XSLT

    Расширяемый язык таблиц стилей (Extensible Stylesheet Language) состоит из двух частей - языка форматирования и языка преобразований (трансформирования). Язык форматирования описывает таблицы стилей XSL, которые подобно таблицам каскадных стилей (CSS), отвечают за отображение в браузере документов XML. Язык преобразований (Extensible Stylesheet Language Transformations) отвечает за средства контроля над выводимыми данными, такими как сортировка, фильтрация, для этого он использует структуру (например, DTD) XML-документов. Таким образом, можно считать обе части одним единым языком - XSL. В литературе и Интернете на сегодняшний день наблюдается различие названий - под XSLT понимается язык XSL, под XSL понимается XSLT и в дополнении ко всем прочим названиям форматов XML это вносит изрядную путаницу. Далее мы будем называть рассматриваемый язык стилей XSL, подразумевая обе эти части.

    Таблица XSL может содержать один или несколько шаблонов, описывающих документ XML. В таблице 10.7 приводится документ XMLTour.xml, соответствующая таблица стилей, содержащая один шаблон, и вид страницы в браузере.

    XSL-таблица с одним шаблоном
    XML - документ, XMLTour.xmlXSL- таблица, XSLTour.xsl
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <?xml-stylesheet type="text/xsl"
     href="XSLTour.xsl"?>
    
    <!-- Название файла
     XMLTour.xml  -->
    
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р.</PRICE>
    <INFORMATION>В стоимость
     двух взрослых
     путевок входит цена
     одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
    <?xml version="1.0"
     encoding="UTF-8" ?>
    
    <xsl:stylesheet
     xmlns:xsl=
     "http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    
    <xsl:template match="/"> 
    
    <H3>Таблица "Туры"</H3> 
    
    <SPAN STYLE="font-style:italic">
     Код тура: </SPAN>
    <xsl:value-of select=
     "TOUR/IDTOUR"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Название:</SPAN> 
    <xsl:value-of select=
     "TOUR/NAME"/> <BR/>  
    <SPAN STYLE=
     "font-style:italic"> Цена:</SPAN> 
    <xsl:value-of select=
     "TOUR/PRICE"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Информация:</SPAN> 
    <xsl:value-of select=
     "TOUR/INFORMATION"/><BR/>  
    
    </xsl:template>  
    </xsl:stylesheet>
    Вид в браузере Internet Explorer

    Для связывания XML-документа с таблицей XSL в прологе указывается ее адрес:

    <?xml-stylesheet
     type="text/xsl"
     href="XSLTour.xsl"?>

    Наиболее часто используется относительный URL - обычно таблица стилей располагается в одной папке с документами. При необходимости можно также указать полный адрес.

    Таблица стилей представляет собой обычный текстовый файл с расширением *.xsl. После создания файла для подсветки синтаксиса его можно открыть с помощью Visual Studio .NET (среда содержит шаблон XSLT-документа, шаблонов XSL в ней нет). Первая строка XSL таблицы указывает на то, что это XML-документ:

    <?xml version="1.0" encoding="UTF-8" ?>

    И действительно, открывая файл файл XSLTour.xsl, в браузере устанавливаем, что это корректно сформированный документ с корневым элементом xsl:stylesheet (рис. 10.16):

    (рис 10.16) Таблица XSL - корректно сформированный XML-документ

    Этот элемент идентифицирует документ как таблицу стилей, он является одним из XSL-элементов специального назначения. Все XSL-элементы принадлежат пространству имен XSL - т.е. необходимо перед названием каждого XSL-элемента писать префикс xsl:, обозначающий пространство имен. Дополнительно указывается пространство имен для спецификации таблицы:

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"

    Детали этого объявления не суть важны, главное, что нужно запомнить, - на сегодняшний день эта самая свежая версия спецификации. (Ранее применялась более старая спецификация http://www.w3.org/ TR/WD-xsl).

    Корневой элемент xsl:stylesheet XSL-таблицы стилей должен содержать один или несколько шаблонов элементов. Корневой элемент из рассмотренного примера содержит только один шаблон, имеющий следующую структуру:

    <xsl:template match="/"> 
    <!--дочерние элементы... --> 
    </xsl:template>

    Браузер использует шаблон для отображения определенной ветви элементов в иерархии XML-документа, с которым связана таблица стилей. Атрибут match шаблона указывает на определенную ветвь. (Атрибут match представляет собой аналог селектора в правиле CSS). Значение атрибута match носит название образца (pattern). Образец в данном примере ("/") представляет корневой элемент всего XML-документа. Этот шаблон, таким образом, включает в себя инструкции для отображения всего XML-документа. Шаблон содержит два вида элементов - HTML и XSL. К HTML-элементам относится заголовок <H3>Таблица "Туры"</H3> и описание названия записи <SPAN STYLE="font-style:italic">Код тура: </SPAN>. Это обычные HTML-элементы, единственное, что нужно делать при работе с ними - добавлять закрывающийся тег для всех элементов. Элементы XSL и отвечают за вывод содержимого XML-документа на web-страницу, - например, здесь выводится содержимое дочернего элемента IDTOUR, который принадлежит родительскому элементу TOUR:

    <xsl:value-of select="TOUR/IDTOUR"/>

    Порядок выводимых элементов определяется именно расположением XSL-элементов, например, если поменять строки, описывающие IDTOUR и NAME, то соответствующим образом изменится web-страница (рис. 10.17 ):

    ...
    <SPAN STYLE="font-style:italic">Название: </SPAN> 
    <xsl:value-of select="TOUR/NAME"/> <BR/> 
    <SPAN STYLE="font-style:italic">Код тура: </SPAN>
    <xsl:value-of select="TOUR/IDTOUR"/><BR/> 
    <SPAN STYLE="font-style:italic"> Цена: </SPAN> 
    <xsl:value-of select="TOUR/PRICE"/><BR/> 
    <SPAN STYLE="font-style:italic">Информация: </SPAN> 
    <xsl:value-of select="TOUR/INFORMATION"/><BR/> 
    ...
    (рис 10.17) Теперь сначала выводится название тура, а затем код

    В программном обеспечении к курсу вы найдете файлы XMLTour.xml и XSLTour.xsl в папке SimpleXSL (Code\Glava5\XSL\SimpleXSL)

    Рассмотрим теперь вывод переменного числа дочерних элементов, входящих в корневой элемент XML-документа. В таблице 10.8 приводится описание этой структуры.

    XSL-таблица с одним шаблоном и несколькими элементами. Фрагменты XSL-таблицы, одинаковые с таблицей XSLTour.xsl, выделены фоновым цветом.
    XML-документ, XMLTour2.xmlXSL-таблица, XSLTour2.xsl
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла XMLTour.xml  -->
    <?xml-stylesheet type="text/xsl"
     href="XSLTour2.xsl"?>
        
    <TABLE>
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых путевок входит
     цена одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>2</IDTOUR>
    <NAME>Греция</NAME>
    <PRICE>32 000,00р. </PRICE>
    <INFORMATION>В августе и
     сентябре действуют
     специальные
     скидки</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>3</IDTOUR>
    <NAME>Таиланд</NAME>
    <PRICE>30 000,00р.</PRICE>
    <INFORMATION>Не включая
     стоимость
     авиабилета</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>4</IDTOUR>
    <NAME>Италия</NAME>
    <PRICE>26 000,00р.</PRICE>
    <INFORMATION>Завтрак
     в отеле включен в стоимость
     путевки</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>5</IDTOUR>
    <NAME>Франция</NAME>
    <PRICE>27 000,00р.</PRICE>
    <INFORMATION>Дополнительные
     экскурсии не входят
     в стоимость путевки</INFORMATION>
    </TOUR>
    </TABLE>
    <?xml version="1.0"
     encoding="UTF-8" ?>
    <xsl:stylesheet xmlns:xsl=
     "http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    
    <xsl:template match="/"> 
    <H3>Таблица "Туры"</H3> 
    <xsl:for-each select="TABLE/TOUR"> <BR/> 
    
    <SPAN STYLE=
     "font-style:italic"
     >Код тура:  </SPAN>
    <xsl:value-of select=
     "IDTOUR"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Название:</SPAN> 
    <xsl:value-of select =
     "NAME"/> <BR/>  
    <SPAN STYLE=
     "font-style:italic">
     Цена: </SPAN> 
    <xsl:value-of select=
     "PRICE"/><BR/>  
    <SPAN STYLE="font-style:italic"
     >Информация:</SPAN> 
    <xsl:value-of select=
     "INFORMATION"/><BR/>  
    </xsl:for-each>  
    </xsl:template>  
    </xsl:stylesheet>
    Вид в браузере Internet Explorer

    Для цикличного вывода содержимого дочернего элемента TOUR, принадлежащего элементу TABLE, используется элемент for-each:

    <xsl:for-each select="TABLE/TOUR">

    Далее, внутри for-each задается описание текущего элемента:

    <xsl:for-each select="TABLE/TOUR"> <BR/> 
    <SPAN STYLE="font-style:italic">Код тура: </SPAN>
    <xsl:value-of select="IDTOUR"/><BR/> 
    ...
    </xsl:for-each>

    В результате выводятся данные из всех элементов TOUR, найденных в документе, независимо от того, сколько этих элементов содержит документ.

    В программном обеспечении к курсу вы найдете файлы XMLTour2.xml и XSLTour2.xsl в папке SomeElement (Code\Glava5\XSL\SomeElement).

    Другой способ отображения повторяющихся XML-элементов состоит в создании отдельного шаблона для каждого элемента с последующим вызовом этого шаблона. Пример использования подобной методики приведен в таблице 10.9.

    XSL-таблица с двумя шаблонами и несколькими элементами. Фрагменты XSL-таблицы, одинаковые с таблицей XSLTour2.xsl, выделены фоновым цветом.
    XML-документ, XMLTour3.xmlXSL-таблица, XSLTour3.xsl
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла XMLTour.xml  -->
    <?xml-stylesheet type=
     "text/xsl"
     href="XSLTour3.xsl"?>
        
    <TABLE>
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых путевок входит
     цена одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>2</IDTOUR>
    <NAME>Греция</NAME>
    <PRICE>32 000,00р. </PRICE>
    <INFORMATION>В августе
     и сентябре действуют
     специальные
     скидки</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>3</IDTOUR>
    <NAME>Таиланд</NAME>
    <PRICE>30 000,00р.</PRICE>
    <INFORMATION>Не включая
     стоимость
     авиабилета</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>4</IDTOUR>
    <NAME>Италия</NAME>
    <PRICE>26 000,00р.</PRICE>
    <INFORMATION>Завтрак
     в отеле включен в стоимость
     путевки</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>5</IDTOUR>
    <NAME>Франция</NAME>
    <PRICE>27 000,00р.</PRICE>
    <INFORMATION>Дополнительные
     экскурсии не входят в стоимость
     путевки</INFORMATION>
    </TOUR>
    </TABLE>
    <?xml version="1.0"
     encoding="UTF-8" ?>
    <xsl:stylesheet
     xmlns:xsl=
     "http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    
    <xsl:template match="/"> 
    <H3>Таблица "Туры"</H3> 
    <xsl:apply-templates
     select="TABLE/TOUR"/>  
    
    </xsl:template>  
    <xsl:template match="TOUR"> 
    
    <P>
    <SPAN STYLE=
     "font-style:italic">Код тура:  </SPAN>
    <xsl:value-of select=
     "IDTOUR"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Название:</SPAN> 
    <xsl:value-of select = "NAME"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">
     Цена: </SPAN> 
    <xsl:value-of select=
     "PRICE"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Информация:</SPAN> 
    <xsl:value-of select=
     "INFORMATION"/><BR/>  
    </P>
    
    </xsl:template>  
    </xsl:stylesheet>

    Таблица стилей XSLTour3.xsl включает в себя два шаблона. Первый шаблон содержит инструкции для отображения коревого элемента - на это указывает атрибут match="/". Этот шаблон мы уже встречали ранее. Второй шаблон содержит инструкции для отображения элемента TOUR (атрибут match="TOUR" ). Сначала браузер обрабатывает шаблон, соответствующий корневой части элемента:

    <xsl:template match="/"> 
    <H3>Таблица "Туры"</H3> 
    <xsl:apply-templates select="TABLE/TOUR" /> 
    
    </xsl:template>

    Элемент apply-templates сообщает браузеру, что для каждого элемента TOUR внутри корневого элемента TABLE он должен обрабатывать шаблон, отвечающий элементу TOUR, - т. е. шаблон, для атрибута match которого установлено значение "TOUR". Далее описывается таблица стилей для этого элемента:

    <xsl:template match="TOUR"> 
    
    <P>
    <SPAN STYLE="font-style:italic">Код тура: </SPAN>
    <xsl:value-of select="IDTOUR"/><BR/> 
    <SPAN STYLE="font-style:italic">Название: </SPAN> 
    <xsl:value-of select = "NAME"/> <BR/> 
    <SPAN STYLE="font-style:italic"> Цена: </SPAN> 
    <xsl:value-of select="PRICE"/><BR/> 
    <SPAN STYLE="font-style:italic">Информация: </SPAN> 
    <xsl:value-of select="INFORMATION"/><BR/> 
    </P>
    
    </xsl:template>

    Доступ к дочерним элементам TOUR осуществляется посредством образца, содержащего только имя элемента:

    <xsl:value-of select="IDTOUR"/>

    В программном обеспечении к курсу вы найдете файлы XMLTour3.xml и XSLTour3.xsl в папке SomeTemplate (Code\Glava5\XSL\ SomeTemplate).

    Для создания таблиц XSL в среде Visual Studio .NET предусмотрен общий шаблон XSLT-документов. При запуске переходим в пункт главного меню "File \ New \ File" (см. рис. 10.3) и в появившемся списке шаблонов выбираем XSLT File. Сгенерированный текст содержит основные определения, для создания файла XSL следует лишь указать пространство имен XSL (таблица 10.10):

    Шаблоны XSLT и XSL
    XSLT-шаблон Visual Studio.NET
    <?xml version="1.0"
     encoding="UTF-8" ?>
    <stylesheet version="1.0"
     xmlns="http://www.w3.org/1999/XSL/Transform">
    
    </stylesheet>
    XSL-таблица стилей
    <?xml version="1.0"
     encoding="UTF-8" ?>
    <xsl:stylesheet xmlns:xsl=
     "http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    
    </xsl:stylesheet>

    Атрибуты XML-документов

    Атрибуты или свойства HTML-элементов представляют собой наиболее наглядное понятие - мы сталкивались с ними при определении фонового цвета странички "Пример HTML-документа.htm":

    <BODY BGCOLOR = LIGHTGREY>

    при определении шрифта и его цвета:

    <FONT COLOR = RED SIZE = 16 FACE = ARIAL>

    Описание атрибута представляет собой пару "имя (BGCOLOR) - значение (LIGHTGREY)", атрибуты отвечают в основном за вид элементов на web-странице (см. рис. 10.2).

    Атрибуты для XML-элементов предназначены для более широкого спектра задач, это своеобразные метки, по которым можно как форматировать затем элемент, применяя CSS или XSL, так и группировать. Они также используются для хранения различных свойств элемента, однако эти свойства не обязательно будут отображены. В спецификации XML не установлено строгих разграничений относительно типа информации, которую можно описывать с помощью атрибутов или внутри содержимого элемента.

    Описание атрибута состоит из имени атрибута, вслед за которым идет знак равенства и значение атрибута. Можно выбирать любое имя атрибута, придерживаясь при этом следующих правил (таблица 10.11).

    Некоторые правила для атрибутов XML-документов
    ПравилоПравильноНеправильно
    Имя атрибута должно начинаться с буквы или символа подчеркивания (_), после чего могут следовать другие буквы, цифры, символы точки (.), тире (-) или подчеркивания
    <TOUR _Open =
     "yes">
    <TOUR 1Open =
     "yes">
    Каждое имя атрибута может только один раз присутствовать в одном и том же начальном теге или в теге пустого элемента
    <TOUR Open =
     "yes">
    <TOUR Open =
     "yes" Open ="undefined" >
    Значение атрибута должно быть заключено в одинарные (') или в двойные кавычки (")
    <TOUR Open =
     "yes"> или
    <TOUR Open =
     'yes'>
    <TOUR Open =
     yes>
    Значение атрибута не может содержать внутри себя тот же символ кавычек, которыми оно ограничено
    <TOUR Open =
     '"yes"'> или
    <TOUR Open =
     "Only 'yes' allowed">
    <TOUR Open =
     ' 'yes' '> или
    <TOUR Open =
     ""yes"">или
    <TOUR Open =
     "Only "yes" allowed">
    Значение атрибута не может содержать символ < (синтаксический анализатор может воспринять этот символ как начало описания XML-разметки)
    <TOUR Open =
     "yes">
    <TOUR Open =
     "<yes>">

    Среда Visual Studio .NET выделяет атрибуты красным шрифтом, при просмотре XML-документа их легко выделять. Мы уже сталкивались с атрибутами при создании самого первого XML-документа:

    <?xml version="1.0" encoding="utf-8" ?>

    Здесь version и encoding - атрибуты, а "1.0" и "utf-8" - их значения соответственно.

    Применение атрибутов в XSL-схемах для фильтрации выводимого содержимого

    Мы уже отмечали преимущества использования XSL-таблиц перед таблицами каскадных стилей. Содержимое XML может фильтроваться или сортироваться при выводе с помощью XSL-таблиц. Пример подобной фильтрации реализован в таблице 10.12.

    XML-документ, XMLTour4.xmlXSL-таблица, XSLTour4.xsl
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла XMLTour.xml  -->
    <?xml-stylesheet type="text/xsl"
     href="XSLTour4.xsl"?>
        
    <TABLE>
    <TOUR Open = "yes">
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р. </PRICE>
    <INFORMfTION>В стоимость
     двух взрослых путевок входит
     цена одной детской
     (до 7лет)</INFORMfTION>
    </TOUR>
    <TOUR>
    <IDTOUR>2</IDTOUR>
    <NAME>Греция</NAME>
    <PRICE>32 000,00р. </PRICE>
    <INFORMfTION>В августе
     и сентябре действуют 
     специальные
     скидки</INFORMfTION>
    </TOUR>
    <TOUR>
    <IDTOUR>3</IDTOUR>
    <NAME>Таиланд</NAME>
    <PRICE>30 000,00р.</PRICE>
    <INFORMfTION>Не включая
     стоимость
     авиабилета</INFORMfTION>
    </TOUR>
    <TOUR>
    <IDTOUR>4</IDTOUR>
    <NAME>Италия</NAME>
    <PRICE>26 000,00р.</PRICE>
    <INFORMfTION>Завтрак
     в отеле включен
     в стоимость
     путевки</INFORMfTION>
    </TOUR>
    <TOUR Open = "yes">
    <IDTOUR>5</IDTOUR>
    <NAME>Франция</NAME>
    <PRICE>27 000,00р.</PRICE>
    <INFORMATION>Дополнительные
     экскурсии не входят
     в стоимость
     путевки</INFORMfTION>
    </TOUR>
    </TABLE>
    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet
     xmlns:xsl=
     "http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    
    <xsl:template match="/"> 
    <H3>Таблица "Туры"</H3> 
    <xsl:for-each select="TABLE/TOUR[@ Open =
     'yes']"> <BR/>
     
    <SPAN STYLE=
     "font-style:italic">Код тура:  </SPAN>
    <xsl:value-of select="IDTOUR"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Название: </SPAN> 
    <xsl:value-of select =
     "NAME"/> <BR/>  
    <SPAN STYLE=
     "font-style:italic"> Цена: </SPAN> 
    <xsl:value-of select=
     "PRICE"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Информация: </SPAN> 
    <xsl:value-of select=
     "INFORMATION"/><BR/>  
    </xsl:for-each>  
    </xsl:template>  
    </xsl:stylesheet>
    Вид в браузере Internet Explorer

    Исходные документы XMLTour2.xml и XSLTour2.xsl были взяты из таблицы 10.8. Для туров с кодами 1 и 5 в тегах TOUR добавлены атрибуты Open:

    ...
    <TOUR Open = "yes">
    		<IDTOUR>1</IDTOUR>
    ...
    <TOUR Open = "yes">
    		<IDTOUR>5</IDTOUR>
    ...

    Таблица XSL трактует атрибут, принадлежащий элементу в XML-документе, как дочерний элемент. Для ссылки на атрибут в образце XSL необходимо предварить имя атрибута символом @, - это указывает, что имя относится к атрибуту, а не к элементу:

    <xsl:for-each select="TABLE/TOUR[@ Open = 'yes']">

    В результате этого отбора были выведены только те элементы XML-документа, которые содержали описываемый атрибут.

    В программном обеспечении к курсу вы найдете файлы XMLTour4.xml и XSLTour4.xsl в папке AttXSL (Code\Glava5\XSL\ AttXSL).

    Страницы:

    Введение в XML

    Что такое HTML?

    Язык разметки гипертекста HTML (Hyper Text Markup Language) представляет собой определенный набор элементов, которые используются для создания web-страницы. Примерами таких элементов являются заголовки, абзацы, списки, таблицы. Запускаем блокнот и вводим следующий текст:

    <HTML>
    <HEAD>
    <TITLE>Это пример простейшего HTML-документа</TITLE>
    </HEAD>
    <BODY BGCOLOR = LIGHTGREY>

    Несколько примеров

    <BR>
    <B> Жирный текст </B>
    <U>Подчеркнутый текст</U>
    <S>Перечеркнутый текст</S>
    <P>Абзац</P>
    <BR>
    <FONT COLOR = RED SIZE = 16 FACE = ARIAL> Красный </FONT> 
    <BR>  
    <FONT COLOR = YELLOW SIZE = 16
     FACE = TIMES NEW ROMAN> Желтый </FONT>
    <BR>
    <FONT COLOR = GREEN SIZE = 16
     FACE = VERDANA> Зеленый </FONT>
    <BR>
    <MARQUEE BGCOLOR = BLACK> 
    <FONT COLOR = WHITE> Бегущая строка </FONT></MARQUEE>
    </BODY>
    </HTML>

    Сохраняем текст, назвав документ "Пример HTML-документа". Открываем "Мой компьютер \ Сервис \ Свойства папки \ вкладка "Вид"" и в окне "Дополнительные параметры" снимаем галочку "Скрывать расширения для зарегистрированных типов файлов". Теперь на компьютере все файлы будут в своем названии содержать и тип: например, рисунки - .bmp или .jpeg, программы - .exe, а файл блокнота - "Пример HTML-документа.txt". Меняем расширение на "Пример HTML-документа.htm" и запускаем. Появляется браузер, в котором открывается созданная страница (рис. 10.1):

    (рис 10.1) Готовая страница в Internet Explorer

    В главном меню выбираем "Вид \ Просмотр НТМL-кода" - появляется блокнот, содержащий набранный текст (рис. 10.2, подписи были добавлены к графическому изображению):

    (рис 10.2) Просмотр HTML-кода страницы

    Обратите внимание на форматирование HTML-кода - браузер игнорирует пробелы, отступы и абзацы; для их вывода на страницу используются специальные элементы. Каждый элемент начинается с начального тега: текста, заключенного в угловые скобки (< >), который содержит имя элемента. В скобках указываются также дополнительные свойства (атрибуты) тега, например, серый фоновый цвет страницы определяет атрибут LIGHTGREY элемента BODY. Большинство элементов заканчиваются конечным тегом, в котором повторяется название элемента с символом косой черты(/), но другие могут оканчиваться иначе - например, тег <BR>. Элемент "содержание" представляет собой текст, расположенный между начальным и конечным тегами. Сами теги могут быть написаны прописными ( <BODY> ) или строчными буквами( <body> ) - в любом случае браузер отобразит страницу верно. Для формирования страницы были использованы следующие эл ементы (Таблица 10.1).

    Некоторые HTML-элементы
    HTML-элементОписание
    <HTML></HTML> Ключевой элемент, текст внутри него и представляет код страницы
    <HEAD></HEAD> "Голова", шапка страницы
    <TITLE></TITLE> Заголовок, отображаемый браузером
    <BODY></BODY> "Тело" страницы, ее содержимое
    BGCOLOR Атрибут, задающий цвет заднего фона
    <BR> Новая строка
    <B></B> Жирный текст
    <U></U> Подчеркнутый текст
    <S></S> Перечеркнутый текст
    <P></P> Абзац
    <FONT></FONT> Оформление шрифта
    COLOR Цвет
    SIZE Размер
    FACE Вид шрифта
    <MARQUEE></MARQUEE> Бегущая строка

    Набор HTML-элементов достаточно велик, но есть документы, которые не могут быть описаны на языке HTML. Это математические, химические формулы, музыкальные символы, иерархические структуры. При выводе содержимого из базы данных HTML представляет данные в виде таблиц, однако в нем нет возможности определения ключей таблиц для последующей сортировки, поиска и фильтрации данных.

    Созданная HTML страничка элементарна, тем не менее в программном обеспечении к курсу вы ее найдете. (Code\Glava5\ Пример HTML-документа.htm).

    SGML, HTML и XML

    Обобщенный структурированный язык разметки (Structured Generalized Language - SGML) представляет собой основу всех языков разметки. SGML не только определяет базовый синтаксис, но дает вам возможность создавать собственные элементы. Для создания описания документа на SGML нужно продумать соответствующий набор элементов и структуру документа.

    Набор наиболее употребительных элементов, используемых для описания документа определенного типа, называется SGML-приложением. Если встроить в программу обработку этих элементов и последующую их интерпретацию, получится браузер. Язык HTML и представляет SGML-пpилoжeниe, разработанное в 1991 г. для описания web-страниц, для которого были созданы различные обозреватели - Internet Explorer, Netscape Navigator, Opera.

    Разработчики из консорциума World Wide Web Consortium (W3C) сочли язык SGML слишком сложным и фундаментальным для представления информации в Интернете. Гибкость и большое обилие средств, поддерживаемых SGML, затрудняет написание программного обеспечения, необходимого для обработки и отображения SGML-информации в web-браузерах. Язык HTML, использующийся вплоть до настоящего времени, справляется со своей основной задачей, однако он не реализует в полной мере мощных функциональных возможностей SGML. В 1996 г. группа XML Working Group разработала ветвь языка SGML, назвав его расширяемым языком разметки - Extensible Markup Language.

    XML является упрощенной версией SGML, приспособленной для Web. При разработке XML-документа вместо использования ограниченного набора определенных элементов можно создавать свои собственные элементы и присваивать им любые имена - именно поэтому язык XML называется расширяемым (extensible). Следовательно, XML пригоден для описания практически любого документа, от математических уравнений до базы данных. Синтаксис XML более простой, чем SGML, что облегчает восприятие XML-документов, а также написание программ браузеров, кодов и Web-страниц для доступа и представления информации документа.

    Создание XML-документа

    Приступим к созданию XML-документа. В качестве структуры, которую мы будем описывать, возьмем таблицу "Туры базы данных" - BDTur_firm.mdb, - с которой мы начали работать еще в первой лекции. Для создания документа запускаем Microsoft Visual Studio .NET, выбираем "File \ New \ File" (или используем сочетание клавиш Ctrl+N) и в списке шаблонов выбираем XML File (рис. 10.3):

    (рис 10.3) Создание XML-документа

    Конечно, XML-документ, так же как и HTML-документ, можно формировать и в блокноте, но подсветка синтаксиса значительно ускорит работу. Сохраняем появившейся документ, называя его XMLTour.xml. В новом документе есть всего одна строчка:

    <?xml version="1.0" encoding="utf-8" ?>

    В первой строке происходит объявление XML, указывающее на то, что это XML-документ, и содержащее номер версии. Объявление XML не является обязательным, хотя спецификация требует его включения. Если вы включаете XML-объявление, оно должно находиться в начале документа. Далее указывается кодировка документа - utf-8. Аналогично, если вы создадите HTML-страницу, выбрав соответствующий шаблон (см. рис. 10.3), в шаблоне будет указываться дополнительная информация, такая как версия языка HTML 4.0, язык EN, пакет верстки - Microsoft Visual Studio .NET 7.1 и другие:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <title></title>
    <meta name="GENERATOR" content="Microsoft Visual Studio
     .NET 7.1">
    <meta name="vs_targetSchema"
     content="http://schemas.microsoft.com/intellisense/ie5">
    </head>
    <body>
    
    </body>
    </html>

    Возвращаемся к нашему XML-документу и вводим комментарий - он начинается с символа "!--" и заканчивается символом "--":

    <!-- Название файла XMLTour.xml -->

    Определяем так называемый элемент "Документ", или корневой элемент. Поскольку у нас таблиц несколько, логично будет назвать его TABLE:

    <TABLE></TABLE>

    При завершении написания начального тега среда автоматически вставляет конечный тег. Внутри корневого элемента определяем вложенные элементы:

    <TABLE>
    	<TOUR>
    		<IDTOUR></IDTOUR>
    		<NAME></NAME>
    		<PRICE></PRICE>
    		<INFORMATION></INFORMATION>
    	</TOUR>
     </TABLE>

    Все! По сути, мы создали таблицу - переключаемся на вкладку( Data ) и вносим данные (рис. 10.4):

    Переключаемся в режим XML, для чего нажимаем соответствующую кнопку(рис 10.4) и видим сформированный документ:

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- Название файла XMLTour.xml -->
    <TABLE>
    	<TOUR>
    		<IDTOUR>1</IDTOUR>
    		<NAME>Кипр</NAME>
    		<PRICE>25 000,00р. </PRICE>
    		<INFORMATION>В стоимость двух взрослых
    		 путевок входит цена одной детской (до 7лет)</INFORMATION>
    	</TOUR>
    	<TOUR>
    		<IDTOUR>2</IDTOUR>
    		<NAME>Греция</NAME>
    		<PRICE>32 000,00р. </PRICE>
    		<INFORMATION>В августе и сентябре
    		 действуют специальные скидки</INFORMATION>
    	</TOUR>
    	<TOUR>
    		<IDTOUR>3</IDTOUR>
    		<NAME>Таиланд</NAME>
    		<PRICE>30 000,00р.</PRICE>
    		<INFORMATION>Не включая
    		 стоимость авиабилета</INFORMATION>
    	</TOUR>
    	<TOUR>
    		<IDTOUR>4</IDTOUR>
    		<NAME>Италия</NAME>
    		<PRICE>26 000,00р.</PRICE>
    		<INFORMATION>Завтрак в отеле
    		 включен в стоимость путевки</INFORMATION>
    	</TOUR>
    	<TOUR>
    		<IDTOUR>5</IDTOUR>
    		<NAME>Франция</NAME>
    		<PRICE>27 000,00р.</PRICE>
    		<INFORMATION>Дополнительные экскурсии
    		 не входят в стоимость путевки</INFORMATION>
    	</TOUR>
    </TABLE>

    Среда Visual Studio .NET облегчает работу по созданию XML-документов, подобно тому, как WYSIWYGWYSIWYG - "What You See Is What You Get" - "Что видишь, то и получаешь". редакторы HTML-кода помогают создавать web-страницы. Сохраним страницу и откроем ее в браузере - можно изменять степень детализации представления документа, щелкая на знаки плюс "+" и минус "-" (рис. 10.5):

    (рис 10.5) Просмотр файла XMLTour.xml в Internet Explorer

    В программном обеспечении к курсу вы найдете документ XMLTour.xml (Code\Glava5\ XMLTour.xml).

    Структура XML-документа

    Созданный нами документ состоит из двух основных частей - пролога и корневого элемента (элемента "Документ") (рис. 10.6).

    (рис 10.6) Структура документа XML

    Пролог может иметь необязательные компоненты, такие как тип и структура документа, инструкции по обработке приложения. Далее мы будем встречать эти компоненты. Корневой элемент представляет собой основу всего элемента и состоит из начального тега, конечного тега и содержимого. В качестве содержимого могут быть данные (текст), другие теги (вложенные элементы) или их сочетание. В рассматриваемом документе корневой элемент - TABLE. Его начальный тег - <TABLE>, конечный - </TABLE>, а содержимое - пять вложенных элементов <TOUR>. Каждый элемент Tour в свою очередь состоит из группы вложенных элементов (рис. 10.7).

    (рис 10.7) Структура элемента

    Каждый тег, входящий в элемент TOUR, представляет собой простейшую структуру (рис. 10.8).

    (рис 10.8) Структура тега

    Структура в точности такая же, как и у элементов HTML, только названия элементов определены, а в тегах XML тип задается пользователем.

    Понятие корректно сформированных (well-formed) XML-документов

    Документ называется корректно сформированным, если он соответствует минимальному набору правил для XML-документов:

  • XML-документ должен иметь только один корневой элемент (элемент "Документ"). Все другие элементы должны быть вложены в корневой элемент.
  • Элементы должны быть вложены упорядоченным образом. Если элемент начинается внутри другого элемента, он должен и заканчиваться внутри этого элемента.
  • Каждый элемент должен иметь начальный и конечный теги. В отличие от HTML, в XML не разрешается опускать конечный тег - даже в том случае, когда браузер в состоянии определить, где заканчивается элемент.
  • Название элемента в начальном теге должно в точности соответствовать (с учетом регистра) названию в соответствующем конечном теге.
  • Название элемента должно начинаться с буквы или с символа подчеркивания ( _ ), после чего могут идти буквы, цифры, символы точки (.), тире (-) или подчеркивания.
  • Это базовые критерии корректного формирования. Для других понятий языка XML (атрибутов, примитивов, связей) действуют свои правила, которые необходимо соблюдать. Можно сказать, что если документ создан правильно, верно и при его отображении и использовании не возникает никаких ошибок, то это и есть корректно сформированный документ. Если вы ошибетесь в каком-либо теге HTML-страницы, браузер просто проигнорирует соответствующий тег, а ошибка в теге XML сделает невозможным отображение страницы. В этом смысле написание XML похоже на программирование на C# - компилятор не запустит программу при наличии синтаксических ошибок. При наличии одной из ошибок встроенный в Internet Explorer анализатор (его иногда называют XML-процессор или парсер) определяет ее позицию (таблица 10.2).

    Ошибки формирования XML-документов
    ОшибкаОписание
    1
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла
     XMLTour.xml  -->
    <TABLE>
    :
    </TABLE>
    <TABLE2>
    </TABLE2>
    В документе находится два корневых элемента
    Результат в Internet Explorer
    2
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла
     XMLTour.xml  -->
    <TABLE>
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых путевок
     входит цена одной детской
     (до 7лет)</TOUR>
    </INFORMATION>
    :
    </TABLE>
    Тег INFORMATION начинается внутри тега TOUR, а заканчивается снаружи

    Правильная структура:

    <TOUR>
    <INFORMATION>
    </INFORMATION>
    </TOUR>

    Неправильная:

    <TOUR>
    <INFORMATION>
    </TOUR>
    </INFORMATION>
    Результат в Internet Explorer
    3
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла
     XMLTour.xml  -->
    <TABLE>
    <TOUR>
    <IDTOUR>1
    :
    </TOUR>
    :
    </TABLE>
    Нет конечного тега IDTOUR
    Результат в Internet Explorer
    4
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла
     XMLTour.xml  -->
    <TABLE>
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</name>
    :
    </TOUR>
    :
    </TABLE>
    Регистр начального и конечного тега не совпадают
    Результат в Internet Explorer
    5
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла
     XMLTour.xml  -->
    <TABLE>
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <1PRICE>25 000,00р. </PRICE>
    :
    </TOUR>
    :
    </TABLE>
    Название элемента 1PRICE начинается с цифры
    Результат в Internet Explorer

    В программном обеспечении к курсу вы найдете папку "Ошибки_XML", в которой находятся рассмотренные документы XML с ошибками (Code\Glava5\Ошибки_XML).

    Что такое каскадные таблицы стилей (CSS)?

    Для определения свойств текста в HTML-документе, таких как размер шрифта, стиль, начертание, цвет, используются атрибуты тегов, в которых указываются нужные параметры. Для нескольких небольших страничек с уникальным дизайном применение атрибутов, относящихся к дизайну, вполне оправданно. Для крупных проектов, например, электронного журнала или портала новостей, где требуется соблюдать одинаковое оформление и иметь возможность быстро его заменять, возникает идея отделить содержимое страницы от его оформления. Это можно сделать с помощью таблиц каскадных стилей (Cascade Style Sheets, CSS). Для присвоения какому-либо элементу определенных характеристик необходимо один раз описать этот элемент и определить это описание как стиль, а в дальнейшем просто указывать, что элемент, который нужно оформить соответствующим образом, должен принять свойства описанного стиля. Эта концепция позволяет также сократить размер страницы - вместо многократного повторения заданного атрибута получаем всего лишь одно описание его стиля.

    В название таблицы стилей включено определение "каскадные", поскольку возможно использование нескольких таблиц стилей для форматирования одного документа HTML, а браузер по определенным правилам выстраивает приоритетность выполнения этих таблиц. Они выстраиваются своеобразным "каскадом", по которому обрабатывается документ.

    Существует четыре основных способа связывания HTML-документа и таблицы стилей.

  • Связывание - одна таблица стилей используется для форматирования нескольких страниц.
  • Внедрение - все правила таблицы стилей задаются непосредственно в самом документе.
  • Встраивание в теги документа - изменяется форматирование конкретных элементов страницы.
  • Импортирование - в один или несколько документов встраивается таблица стилей, расположенная на сервере.
  • Рассмотрим каждый из этих способов в отдельности.

  • Связывание

    Запускаем Visual Studio .NET и создаем три HTML-страницы (см. рис. 10.3, шаблон HTML-Page), которые называем 1, 2 и 3. Затем создаем файл MyStyle.css, для которого выбираем шаблон Style Sheet (см. рис. 10.3). Сохраняем все эти файлы в одну папку, которую называем "Связывание". Содержимое и вид страниц после запуска приводится в таблице 10.3.

    Применение CSS: связывание
    Название файла Содержимое Вид в Internet Explorer
    1.htm
    <html>
    <head>
    <title>Первая страница</title>
    <LINK REL=STYLESHEET
     TYPE="text/css"
     HREF="MyStyle.css"></LINK>
    </head>
    <body>
    <h1>Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    </body>
    </html>
    2.htm
    <html>
    <head>
    <title>Вторая страница</title>
    <LINK REL=STYLESHEET
     TYPE="text/css"
     HREF="MyStyle.css"></LINK>
    </head>
    <body>
    <h4>Четвертый заголовок</h4>
    <h5>Пятый заголовок</h5>
    <h6>Шестой заголовок</h6>
    </body>
    </html>
    3.htm
    <html>
    <head>
    <title>Третья страница</title>
    <LINK REL=STYLESHEET
     TYPE="text/css"
     HREF="MyStyle.css"></LINK>
    </head>
    <body>
    <h1>Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    <h4>Четвертый заголовок</h4>
    <h5>Пятый заголовок</h5>
    <h6>Шестой заголовок</h6>
    </body>
    </html>
    MyStyle.css
    BODY
    {background: Dodgerblue
    }
    H1{font-family:Arial; color:Red;
     font-size:medium}
    H2{font-family:Bookman Old Style;
     color:Orangered; font-size:medium}
    H3{font-family:Comic Sans MS;
     color:Yellow; font-size:medium}
    H4{font-family:Courier New;
     color:Lime; font-size:medium}
    H5{font-family:Times New Roman;
     color:Mediumblue; font-size:medium}
    H6{font-family:Verdana;
     color:Darkviolet; font-size:medium}

    Элементы h1, h2, ..., h6 используются для создания заголовков текста. Без применения стиля самый крупный заголовок - h1, самый мелкий - h6.

    Итак, в самих документах нет описания того, как должны выглядеть страницы. Вместо этого во всех трех страницах есть инструкция, указывающая на файл MyStyle.css:

    <LINK REL=STYLESHEET TYPE="text/css"
     HREF="MyStyle.css"></LINK>

    Первые два параметра этого тега являются зарезервированными именами, требующимися для того, чтобы сообщить браузеру, что на этой страничке будет использоваться CSS. Третий параметр - HREF= "URL" - указывает на файл, который содержит описания стилей. Этот параметр должен содержать либо относительный путь к файлу - в случае если он находится на том же сервере, что и документ, из которого к нему обращаются, - либо полный URL ("http://...") в случае если файл стилей находится на другом сервере.

    Файл MyStyle.css не выводится бразуером - в нем хранится лишь описание стилей. В рассматриваемом примере элементу BODY, отвечающему за содержимое страницы, устанавливается значение фонового цвета Dodgerblue:

    BODY {background: Dodgerblue}

    Вначале указывается название элемента ( BODY ), затем атрибут ( background ) со значением после двоеточия ( Dodgerblue ).

    Аналогичная конструкция, задающая значение фонового цвета в виде атрибута, будет иметь следующий вид:

    <body bgcolor="Dodgerblue">
    </body>

    При описании нескольких свойств они разделяются точкой с запятой:

    H1{font-family:Arial; color:Red; font-size:medium}

    Простое задание атрибутов элемента H1 выглядит так:

    <h1><font family="Arial" color="Red"
     size="medium">Первый заголовок<font></h1>

    Вы могли заметить, что названия элементов я иногда писал прописными буквами ( H1 ), а иногда строчными ( h1 ). Для HTML это допустимо (для XML - нет) - браузеры правильно интерпретируют описание в обоих случаях. Также я указывал значения атрибутов иногда в кавычках ( bgcolor="Dodgerblue" ) а иногда - нет ( bgcolor = lightgrey ). Опять-таки, при работе с HTML-документами так делать можно, при работе с XML - нет (все значения атрибутов должны указываться в кавычках, см. далее).

    При создании таблицы каскадных стилей некоторые свойства отличаются от аналогичных атрибутов - сравните названия "background" и "bgcolor". Сориентироваться при создании таблицы стилей вам помогут всплывающие подсказки Visual Studio .NET (рис. 10.9) и собственный опыт.

    (рис 10.9) Всплывающая подсказка Visual Studio .NET при работе с шаблоном Style Sheet

    В программном обеспечении к курсу вы найдете папку "Связывание" с рассмотренными документами (Code\Glava5\CSS\Связывание).

  • Внедрение

    Другой способ использования CSS - внедрение описания стилей в сам документ. Создадим новую папку, назовем ее "Внедрение" и изменим страницы 1, 2 и 3 следующим образом (таблица 10.4):

    Применение CSS: внедрение
    Название файлаСодержимое
    1.htm
    <html>
    <head>
    <title>Первая страница</title>
    <STYLE TYPE="text/css">
    <!-- body {background: Dodgerblue } 
    H1{font-family:Arial; color:Red; font-size:medium}
    H2{font-family:Bookman Old Style; color:Orangered;
     font-size:medium} 
    H3{font-family:Comic Sans MS; color:Yellow; 
    font-size:medium} 
    --> </STYLE>
    </head>
    <body>
    <h1>Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    </body>
    </html>
    2.htm
    <html>
    <head>
    <title>Вторая страница</title>
    <STYLE TYPE="text/css">
    <!-- body {background: Dodgerblue } 
    H4{font-family:Courier New; color:Lime;
     font-size:medium} 
    H5{font-family:Times New Roman;
     color:Mediumblue; font-size:medium} 
    H6{font-family:Verdana; color:Darkviolet;
     font-size:medium} 
    --> </STYLE>
    </head>
    <body>
    <h4>Четвертый заголовок</h4>
    <h5>Пятый заголовок</h5>
    <h6>Шестой заголовок</h6>
    </body>
    </html>
    3.htm
    <html>
    <head>
    <title>Третья страница</title>
    <STYLE TYPE="text/css">
    <!-- body {background: Dodgerblue } 
    H1{font-family:Arial; color:Red;
     font-size:medium} 
    H2{font-family:Bookman Old Style;
     color:Orangered; font-size:medium}
    H3{font-family:Comic Sans MS;
     color:Yellow; font-size:medium} 
    H4{font-family:Courier New;
     color:Lime; font-size:medium}
    H5{font-family:Times New Roman;
     color:Mediumblue; font-size:medium} 
    H6{font-family:Verdana;
     color:Darkviolet; font-size:medium} 
    --> </STYLE>
    </head>
    <body>
    <h1>Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    <h4>Четвертый заголовок</h4>
    <h5>Пятый заголовок</h5>
    <h6>Шестой заголовок</h6>
    </body>
    </html>

    При запуске этих страниц их внешний вид не изменится, поскольку мы оставили стили страниц прежними. Описание располагается внутри тега STYLE:

    <STYLE type="text/css">... </STYLE>.

    Сама конструкция окружена символами комментария:

    <!-- _-->

    Несмотря на то, что подавляющее большинство браузеров поддерживает CSS, всегда следует учитывать обратную возможность - в этом случае знаки комментария позволят проигнорировать описание и избежать ошибки.

    В программном обеспечении к курсу вы найдете папку "Внедрение" с рассмотренными документами (Code\Glava5\CSS\Внедрение).

  • Встраивание в теги документа

    Третий вариант, когда описание стиля располагается непосредственно внутри тега описываемого элемента при помощи атрибута STYLE . Этот метод нежелателен, он приводит к потере одного из основных преимуществ CSS - возможности отделения информации от описания оформления информации. Впрочем, если необходимо описать лишь один элемент, этот вариант расположения описания стилей также вполне применим. Создадим новую папку и назовем ее "Встраивание". Скопируем в нее файлы 1.htm и MyStyle.css из папки "Связывание". Теперь у нас есть HTML-документ со связанной таблицей стилей. Сделаем копию документа 1.htm и назовем ее Встраивание1.htm. Изменим HTML-код этого документа:

    <html>
    <head>
    <title>Первая страница</title>
    <LINK REL=STYLESHEET TYPE="text/css"
     HREF="MyStyle.css"></LINK>
    </head>
    <body>
    <h1 STYLE="font-family:Comic Sans MS; color:Indigo; 
    font-size:xx-large">Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    </body>
    </html>

    Таблица стилей по-прежнему работает для этого документа, но описание тега h1 имеет больший приоритет (рис. 10.10):

    (рис 10.10) Встраивание стиля в тег документа (сравните с табл. 10.3)

    В программном обеспечении к курсу вы найдете папку "Встраивание" с рассмотренными документами (Code\Glava5\CSS\Внедрение).

  • Импортирование

    Последний способ применения CSS - импорт внешней таблицы стилей (расположенной на сервере) с помощью свойства @import:

    <html>
    <head>
    <title>Первая страница</title>
    <STYLE>
    @import:url(http://somename.ru/MyStyle.css)
    </STYLE>
    </head>
    <body>
    <h1>Первый заголовок</h1>
    <h2>Второй заголовок</h2>
    <h3>Третий заголовок</h3>
    </body>
    </html>
  • Применение CSS для представления XML

    При просмотре документа XMLTour.xml в браузере была представлена определенная структура, однако его внешний вид напоминает скорее внутренний HTML-код web-страницы, чем готовый документ. Дело в том, что мы создали свой набор элементов, и браузер не имеет встроенных средств, позволяющих определить, как его надо отобразить. Создание таблицы каскадных стилей и связывание ее с XML-документом - это один из способов сообщить браузеру, как отображать каждый из элементов документа.

    Хранение инструкций по отображению в таблице стилей отдельно от самого XML-документа повышает гибкость XML-документа и облегчает работу с ним. Можно быстро адаптировать один XML-документ к различным условиям отображения (различным браузерам, приложениям, контекстным ситуациям) простым присоединением соответствующей таблицы стилей, без необходимости изменения самого документа.

    Мы рассмотрим один из способов связи XML с CSS. Создадим новую папку и назовем ее CSSXML. Скопируем в нее документ XMLTour.xml и MyStyle.css. Во избежание путаницы переименуем MyStyle.css в CSSTour.css, затем откроем этот файл и изменим содержимое следующим образом:

    TABLE{display:block; font-family:Arial; color:Red; font-size:medium}

    В XML-документе элемент TABLE - корневой. Открываем XMLTour.xml и указываем связь с таблицей стилей:

    <?xml version="1.0" encoding="utf-8" ?>
    
    <!-- Название файла XMLTour.xml -->
    <?xml-stylesheet type="text/css" href="CSSTour.css"?> 
    <TABLE>
    ...
    </TABLE>

    Просматриваем документ в браузере - все дочерние элементы приняли свойства корневого (рис. 10.11):

    (рис 10.11) Просмотр XMLTour.xml с таблицей стилей

    Для указания свойств дочерних элементов необходимо указать их описание в таблице стилей. Сделаем копии файлов XMLTour.xml и CSSTour.css и назовем их XMLTour2.xml и CSSTour2.css соответственно. В таблице стилей зададим описание для всех элементов:

    TABLE{display:block; font-family:Arial; color:Red; 
    font-size:medium}
    TOUR{font-family:Bookman Old Style; color:Orangered; 
    font-size:medium}
    IDTOUR{font-family:Comic Sans MS; color:Yellow; font-size:medium}
    NAME{font-family:Courier New; color:Lime; font-size:medium}
    PRICE{font-family:Times New Roman; color:Mediumblue; 
    font-size:medium}
    INFORMATION{font-family:Verdana; color:Darkviolet; font-size:medium}

    В файле XMLTour2.xml изменим связь:

    ...
    <?xml-stylesheet type="text/css" href="CSSTour2.css"?> 
    ...

    Теперь каждый элемент имеет свое описание (рис. 10.12):

    (рис 10.12) Применение стиля к каждому элементу XMLTour2.xml

    Определение собственных стилей имеет больший приоритет перед описанием корневого элемента. Поскольку в рассматриваемом случае теги TABLE и TOUR не содержат символьных данных, их определение можно опустить, и тогда эквивалентная таблица стилей примет вид

    IDTOUR{font-family:Comic Sans MS; color:Yellow; font-size:medium}
    NAME{font-family:Courier New; color:Lime; font-size:medium}
    PRICE{font-family:Times New Roman; color:Mediumblue; 
    font-size:medium}
    INFORMATION{font-family:Verdana; color:Darkviolet; 
    font-size:medium}

    Таблица стилей состоит из одного или нескольких правил (иногда их называют набором правил). Правило содержит информацию по отображению определенного типа элемента в XML-документе. Селектор представляет собой имя типа элемента, к которому относится информация по отображению (рис. 10.13):

    (рис 10.13) Структура правила таблицы стилей

    За селектором следует блок объявлений, который ограничивается фигурными скобками ({}) и содержит одно или несколько объявлений, разделяемых точкой с запятой.

    Каждое объявление задает установку определенного свойства, такого как размер шрифта, который будет использован для отображения элемента. Объявление состоит из свойства, вслед за которым идет двоеточие, и затем следует значение для данного свойства (рис. 10.14):

    (рис 10.14) Структура объявления

    Таблица каскадных стилей позволяет управлять способами форматирования содержимого элементов в XML-документах, но она не дает возможности изменять или реорганизовывать само содержимое. Она также не позволяет осуществлять доступ к компонентам XML и не дает возможности обрабатывать информацию, которую эти компоненты содержат.

    В программном обеспечении к курсу вы найдете папку "CSSXML" с рассмотренными документами (Code\Glava5\ CSSXML).

    Создание действительных (valid) XML-документов. Определение типа документа (DTD)

    Любой XML-документ должен отвечать минимальным требованиям по составлению, т.е. быть корректно сформированным. Если документ содержит ошибки, он не может считаться XML-документом.

    Корректно сформированный XML-документ также может быть действительным ( valid ). Действительным называется корректно сформированный ( well-formed ) документ, отвечающий двум дополнительным требованиямСреда Microsoft Visual Studio.NET не содержит встроенных средств для проверки документа на действительность. Для этого можно использовать специализированные xml-редакторы, например, <oXygen/> (http://www.oxygenxml.com/).:

  • Пролог документа должен содержать специальное объявление типа документа, которое включает определение типа документа ( Data Type Definition, DTD ), задающее структуру документа.
  • Корневой элемент должен отвечать структуре, заданной в DTD.
  • Использование критерия действительности необходимо для включения XML-документа в группу схожих документов, отвечающих определенной структуре или набору стандартов. Достаточно один раз выработать схему DTD и затем просто подключать ее к создаваемым документам. Стандарт XML определяет DTD как "грамматику для определенного класса документов".

    Объявление типа документа представляет собой блок XML-разметки, который располагается в любом месте пролога корректно сформированного документа. Оно имеет следующую обобщенную форму записи:

    <!DOCTYPE Название_корневого_элемента DTD>

    DTD представляет собой определение типа документа. Оно состоит из символа левой квадратной скобки ([), после которой следует ряд объявлений разметки, заканчивающихся правой квадратной скобкой (]). Объявления разметки описывают логическую структуру документа, т.е. задают элементы документа, атрибуты и другие компоненты. Действительный XML-документ, содержащий DTD с единственным объявлением разметки, которое определяет один тип элемента в документе, TABLE, выглядит так (рис. 10.15).

    (рис 10.15) Простейший документ с DTD

    В этом примере DTD документа указывает, что он может содержать только элементы типа TABLE (это единственный заданный тип элемента) и что элемент TABLE может иметь любое допустимое для данного типа содержимое (ключевое слово ANY).

    DTD может содержать различные типы объявлений разметки: объявления типов документов, объявления типов атрибутов, инструкции по обработке и другие. Объявление типа элемента имеет следующую обобщенную форму:

    <!ELEMENT Название_элемента описание_содержимого>

    Некоторые возможные описания содержимого приведены в таблице 10.5.

    Объявления содержимого документа
    ШаблонОписание
    1
    <!ELEMENT Название_элемента
     (#PCDATA)>
    Элемент TABLE может содержать только символьные данные, дочерние элементы не допускаются
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?> 
    <!DOCTYPE TABLE [<!ELEMENT TABLE
     (#PCDATA)>] >
    <TABLE>Простейший документ</TABLE>
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE (#PCDATA)>] >
    <TABLE>
    <TOUR></TOUR>
    Простейший документ
    </TABLE>
    2
    <!ELEMENT Название_элемента
     ANY>
    Элемент TABLE может содержать любые данные. Объявлять тип элемента в документе можно только один раз.
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE ANY>] >
    <TABLE>
    <TOUR></TOUR>
    Простейший документ
    </TABLE>
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE ANY>] >
    [<!ELEMENT TABLE (#PCDATA)>] >
    <TABLE>
    <TOUR></TOUR>
    Простейший документ
    </TABLE>
    3
    <!ELEMENT Название_элемента
     (Название_дочернего_элемента)+>
    Элемент TABLE может содержать один или несколько элементов TOUR
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE (TOUR)+>] >
    <TABLE>
    <TOUR>Кипр</TOUR>
    <TOUR>Греция</TOUR>
    <TOUR>Таиланд</TOUR>
    <TOUR>Италия</TOUR>
    </TABLE>
    4
    <!ELEMENT Название_элемента
     EMPTY>
    Элемент TABLE должен быть пустым, т.е. не иметь содержимого
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE EMPTY>] >
    <TABLE>
    </TABLE>
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TABLE [<!ELEMENT
     TABLE EMPTY>] >
    <TABLE> Простейший документ
    </TABLE>

    При создании документа XMLTour.xml мы определили элемент TOUR, который содержит дочерние элементы в следующей последовательности: IDTOUR, NAME, PRICE и INFORMATION. Далее, при заполнении списка туров для нас важно осуществлять проверку расположения элементов - дочерние элементы должны располагаться только так. В таблице 10.6 рассмотрены некоторые типичные примеры определения расположения дочерних элементов.

    Примеры описания структуры элемента
    ШаблонОписание
    1
    <!ELEMENT Название_элемента
     (Название_первого_дочернего_элемента,
     название_второго_дочернего_элемента,
     название_третьего_дочернего_элемента,:,
     название_n-ного_дочернего_элемента)>
    Последовательная форма модели содержимого указывает, что элемент должен иметь заданную последовательность дочерних элементов. Имена типов дочерних элементов отделяются запятыми. Пропуск дочернего элемента или использование одного и того же типа дочернего элемента более одного раза также недопустимо
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TOUR 
    [
    <!ELEMENT TOUR (IDTOUR, NAME,
     PRICE, INFORMATION)>
    <!ELEMENT IDTOUR (#PCDATA)> 
    <!ELEMENT NAME (#PCDATA)>  
    <!ELEMENT PRICE (#PCDATA)> 
    <!ELEMENT INFORMATION (#PCDATA)> 
    ] >
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых
     путевок входит цена
     одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TOUR 
    [
    <!ELEMENT TOUR (IDTOUR, NAME,
     PRICE, INFORMATION)>
    <!ELEMENT IDTOUR (#PCDATA)> 
    <!ELEMENT NAME (#PCDATA)>  
    <!ELEMENT PRICE (#PCDATA)> 
    <!ELEMENT INFORMATION (#PCDATA)> 
    ] >
    <TOUR>
    <NAME>Кипр</NAME>
    <IDTOUR>1</IDTOUR>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых
     путевок входит цена
     одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
    2
    <!ELEMENT Название_элемента
     (Название_первого_дочернего_элемента |
     название_второго_дочернего_элемента |
     название_третьего_дочернего_элемента |:|
     название_n-ного_дочернего_элемента)>
    Выборочная форма модели содержимого указывает, что элемент может иметь один любой из серии допустимых дочерних элементов, разделяемых символом "|"
    Пример
    ПравильноНеправильно
    <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TOUR 
    [
    <!ELEMENT TOUR (IDTOUR | NAME |
     PRICE | INFORMATION)>
    <!ELEMENT IDTOUR (#PCDATA)> 
    <!ELEMENT NAME (#PCDATA)>  
    <!ELEMENT PRICE (#PCDATA)> 
    <!ELEMENT INFORMATION (#PCDATA)> 
    ] >
    Правильные варианты:
  • <TOUR>
    <IDTOUR>1</IDTOUR>
    </TOUR>
  • <TOUR>
    <NAME>Кипр</NAME>
    </TOUR>
  • <TOUR>
    <PRICE>25 000,00р. </PRICE>
    </TOUR>
  • <TOUR>
    <INFORMATION>В стоимость
     двух взрослых
     путевок входит цена
     одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
  • <?xml version="1.0"
     encoding="utf-8" ?>
    <!DOCTYPE TOUR 
    [
    <!ELEMENT TOUR (IDTOUR | NAME |
     PRICE | INFORMATION)>
    <!ELEMENT IDTOUR (#PCDATA)> 
    <!ELEMENT NAME (#PCDATA)>  
    <!ELEMENT PRICE (#PCDATA)> 
    <!ELEMENT INFORMATION (#PCDATA)> 
    ] >
    Неправильные варианты:
  • <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    
    </TOUR>
  • <TOUR>
    <NAME>Кипр</NAME>
    <IDTOUR>1</IDTOUR>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых
     путевок входит цена
     одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
  • Рассмотренные модели содержимого можно дополнять следующими знаками:

    + - один или несколько элементов;

    * - ни одного или несколько элементов;

    ? - ни одного или один элемент.

    Следующее объявление означает, что документ может содержать один или несколько элементов NAME и что элемент INFORMATION может не существовать или быть в единственном экземпляре:

    ...
    <!ELEMENT TOUR (IDTOUR, NAME+, PRICE, INFORMATION?)>
    ...
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <NAME>Греция(включая Кипр)</NAME>
    <PRICE>25 000,00р. </PRICE>
    </TOUR>

    Другое объявление означает, что документ может содержать ни одного или несколько элементов IDTOUR, либо элемент NAME, либо элемент PRICE, либо ни одного или один элемент INFORMATION:

    ...
    <!ELEMENT TOUR (IDTOUR* | NAME| PRICE | INFORMATION?)>
    ...

    Соответствующие правильные три варианта выглядят следующим образом:

    <TOUR>
    <IDTOUR>1</IDTOUR>
    <IDTOUR>2</IDTOUR>
    </TOUR>
    
    <TOUR>
    <NAME>Кипр</NAME>
    </TOUR>
    
    <TOUR>
    </TOUR>

    Указанные модели и символы поддерживают сложные образования, образуемые вложением последовательной модели содержимого в выборочную, и наоборот. Примером такого сложного образования может служить следующее объявление:

    <!DOCTYPE TOUR 
    [ 
    <!ELEMENT TOUR (IDTOUR, NAME, (PRICE_EURO | PRICE_DOLLAR | PRICE_RUB) )> 
    <!ELEMENT IDTOUR (#PCDATA)> 
    <!ELEMENT NAME (#PCDATA)> 
    <!ELEMENT PRICE_EURO (#PCDATA)> 
    <!ELEMENT PRICE_DOLLAR (#PCDATA)> 
    <!ELEMENT PRICE_RUB (#PCDATA)> 
    ] >

    Для него будут верными следующие варианты корневого элемента:

  • <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE_RUB>25 000,00р. </PRICE_RUB>
    </TOUR>
  • <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE_DOLLAR>1000$. </PRICE_DOLLAR>
    </TOUR>
  • <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE_EURO>760 _. </PRICE_EURO>
    </TOUR>
  • XSL и XSLT

    Расширяемый язык таблиц стилей (Extensible Stylesheet Language) состоит из двух частей - языка форматирования и языка преобразований (трансформирования). Язык форматирования описывает таблицы стилей XSL, которые подобно таблицам каскадных стилей (CSS), отвечают за отображение в браузере документов XML. Язык преобразований (Extensible Stylesheet Language Transformations) отвечает за средства контроля над выводимыми данными, такими как сортировка, фильтрация, для этого он использует структуру (например, DTD) XML-документов. Таким образом, можно считать обе части одним единым языком - XSL. В литературе и Интернете на сегодняшний день наблюдается различие названий - под XSLT понимается язык XSL, под XSL понимается XSLT и в дополнении ко всем прочим названиям форматов XML это вносит изрядную путаницу. Далее мы будем называть рассматриваемый язык стилей XSL, подразумевая обе эти части.

    Таблица XSL может содержать один или несколько шаблонов, описывающих документ XML. В таблице 10.7 приводится документ XMLTour.xml, соответствующая таблица стилей, содержащая один шаблон, и вид страницы в браузере.

    XSL-таблица с одним шаблоном
    XML - документ, XMLTour.xmlXSL- таблица, XSLTour.xsl
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <?xml-stylesheet type="text/xsl"
     href="XSLTour.xsl"?>
    
    <!-- Название файла
     XMLTour.xml  -->
    
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р.</PRICE>
    <INFORMATION>В стоимость
     двух взрослых
     путевок входит цена
     одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
    <?xml version="1.0"
     encoding="UTF-8" ?>
    
    <xsl:stylesheet
     xmlns:xsl=
     "http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    
    <xsl:template match="/"> 
    
    <H3>Таблица "Туры"</H3> 
    
    <SPAN STYLE="font-style:italic">
     Код тура: </SPAN>
    <xsl:value-of select=
     "TOUR/IDTOUR"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Название:</SPAN> 
    <xsl:value-of select=
     "TOUR/NAME"/> <BR/>  
    <SPAN STYLE=
     "font-style:italic"> Цена:</SPAN> 
    <xsl:value-of select=
     "TOUR/PRICE"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Информация:</SPAN> 
    <xsl:value-of select=
     "TOUR/INFORMATION"/><BR/>  
    
    </xsl:template>  
    </xsl:stylesheet>
    Вид в браузере Internet Explorer

    Для связывания XML-документа с таблицей XSL в прологе указывается ее адрес:

    <?xml-stylesheet
     type="text/xsl"
     href="XSLTour.xsl"?>

    Наиболее часто используется относительный URL - обычно таблица стилей располагается в одной папке с документами. При необходимости можно также указать полный адрес.

    Таблица стилей представляет собой обычный текстовый файл с расширением *.xsl. После создания файла для подсветки синтаксиса его можно открыть с помощью Visual Studio .NET (среда содержит шаблон XSLT-документа, шаблонов XSL в ней нет). Первая строка XSL таблицы указывает на то, что это XML-документ:

    <?xml version="1.0" encoding="UTF-8" ?>

    И действительно, открывая файл файл XSLTour.xsl, в браузере устанавливаем, что это корректно сформированный документ с корневым элементом xsl:stylesheet (рис. 10.16):

    (рис 10.16) Таблица XSL - корректно сформированный XML-документ

    Этот элемент идентифицирует документ как таблицу стилей, он является одним из XSL-элементов специального назначения. Все XSL-элементы принадлежат пространству имен XSL - т.е. необходимо перед названием каждого XSL-элемента писать префикс xsl:, обозначающий пространство имен. Дополнительно указывается пространство имен для спецификации таблицы:

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"

    Детали этого объявления не суть важны, главное, что нужно запомнить, - на сегодняшний день эта самая свежая версия спецификации. (Ранее применялась более старая спецификация http://www.w3.org/ TR/WD-xsl).

    Корневой элемент xsl:stylesheet XSL-таблицы стилей должен содержать один или несколько шаблонов элементов. Корневой элемент из рассмотренного примера содержит только один шаблон, имеющий следующую структуру:

    <xsl:template match="/"> 
    <!--дочерние элементы... --> 
    </xsl:template>

    Браузер использует шаблон для отображения определенной ветви элементов в иерархии XML-документа, с которым связана таблица стилей. Атрибут match шаблона указывает на определенную ветвь. (Атрибут match представляет собой аналог селектора в правиле CSS). Значение атрибута match носит название образца (pattern). Образец в данном примере ("/") представляет корневой элемент всего XML-документа. Этот шаблон, таким образом, включает в себя инструкции для отображения всего XML-документа. Шаблон содержит два вида элементов - HTML и XSL. К HTML-элементам относится заголовок <H3>Таблица "Туры"</H3> и описание названия записи <SPAN STYLE="font-style:italic">Код тура: </SPAN>. Это обычные HTML-элементы, единственное, что нужно делать при работе с ними - добавлять закрывающийся тег для всех элементов. Элементы XSL и отвечают за вывод содержимого XML-документа на web-страницу, - например, здесь выводится содержимое дочернего элемента IDTOUR, который принадлежит родительскому элементу TOUR:

    <xsl:value-of select="TOUR/IDTOUR"/>

    Порядок выводимых элементов определяется именно расположением XSL-элементов, например, если поменять строки, описывающие IDTOUR и NAME, то соответствующим образом изменится web-страница (рис. 10.17 ):

    ...
    <SPAN STYLE="font-style:italic">Название: </SPAN> 
    <xsl:value-of select="TOUR/NAME"/> <BR/> 
    <SPAN STYLE="font-style:italic">Код тура: </SPAN>
    <xsl:value-of select="TOUR/IDTOUR"/><BR/> 
    <SPAN STYLE="font-style:italic"> Цена: </SPAN> 
    <xsl:value-of select="TOUR/PRICE"/><BR/> 
    <SPAN STYLE="font-style:italic">Информация: </SPAN> 
    <xsl:value-of select="TOUR/INFORMATION"/><BR/> 
    ...
    (рис 10.17) Теперь сначала выводится название тура, а затем код

    В программном обеспечении к курсу вы найдете файлы XMLTour.xml и XSLTour.xsl в папке SimpleXSL (Code\Glava5\XSL\SimpleXSL)

    Рассмотрим теперь вывод переменного числа дочерних элементов, входящих в корневой элемент XML-документа. В таблице 10.8 приводится описание этой структуры.

    XSL-таблица с одним шаблоном и несколькими элементами. Фрагменты XSL-таблицы, одинаковые с таблицей XSLTour.xsl, выделены фоновым цветом.
    XML-документ, XMLTour2.xmlXSL-таблица, XSLTour2.xsl
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла XMLTour.xml  -->
    <?xml-stylesheet type="text/xsl"
     href="XSLTour2.xsl"?>
        
    <TABLE>
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых путевок входит
     цена одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>2</IDTOUR>
    <NAME>Греция</NAME>
    <PRICE>32 000,00р. </PRICE>
    <INFORMATION>В августе и
     сентябре действуют
     специальные
     скидки</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>3</IDTOUR>
    <NAME>Таиланд</NAME>
    <PRICE>30 000,00р.</PRICE>
    <INFORMATION>Не включая
     стоимость
     авиабилета</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>4</IDTOUR>
    <NAME>Италия</NAME>
    <PRICE>26 000,00р.</PRICE>
    <INFORMATION>Завтрак
     в отеле включен в стоимость
     путевки</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>5</IDTOUR>
    <NAME>Франция</NAME>
    <PRICE>27 000,00р.</PRICE>
    <INFORMATION>Дополнительные
     экскурсии не входят
     в стоимость путевки</INFORMATION>
    </TOUR>
    </TABLE>
    <?xml version="1.0"
     encoding="UTF-8" ?>
    <xsl:stylesheet xmlns:xsl=
     "http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    
    <xsl:template match="/"> 
    <H3>Таблица "Туры"</H3> 
    <xsl:for-each select="TABLE/TOUR"> <BR/> 
    
    <SPAN STYLE=
     "font-style:italic"
     >Код тура:  </SPAN>
    <xsl:value-of select=
     "IDTOUR"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Название:</SPAN> 
    <xsl:value-of select =
     "NAME"/> <BR/>  
    <SPAN STYLE=
     "font-style:italic">
     Цена: </SPAN> 
    <xsl:value-of select=
     "PRICE"/><BR/>  
    <SPAN STYLE="font-style:italic"
     >Информация:</SPAN> 
    <xsl:value-of select=
     "INFORMATION"/><BR/>  
    </xsl:for-each>  
    </xsl:template>  
    </xsl:stylesheet>
    Вид в браузере Internet Explorer

    Для цикличного вывода содержимого дочернего элемента TOUR, принадлежащего элементу TABLE, используется элемент for-each:

    <xsl:for-each select="TABLE/TOUR">

    Далее, внутри for-each задается описание текущего элемента:

    <xsl:for-each select="TABLE/TOUR"> <BR/> 
    <SPAN STYLE="font-style:italic">Код тура: </SPAN>
    <xsl:value-of select="IDTOUR"/><BR/> 
    ...
    </xsl:for-each>

    В результате выводятся данные из всех элементов TOUR, найденных в документе, независимо от того, сколько этих элементов содержит документ.

    В программном обеспечении к курсу вы найдете файлы XMLTour2.xml и XSLTour2.xsl в папке SomeElement (Code\Glava5\XSL\SomeElement).

    Другой способ отображения повторяющихся XML-элементов состоит в создании отдельного шаблона для каждого элемента с последующим вызовом этого шаблона. Пример использования подобной методики приведен в таблице 10.9.

    XSL-таблица с двумя шаблонами и несколькими элементами. Фрагменты XSL-таблицы, одинаковые с таблицей XSLTour2.xsl, выделены фоновым цветом.
    XML-документ, XMLTour3.xmlXSL-таблица, XSLTour3.xsl
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла XMLTour.xml  -->
    <?xml-stylesheet type=
     "text/xsl"
     href="XSLTour3.xsl"?>
        
    <TABLE>
    <TOUR>
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р. </PRICE>
    <INFORMATION>В стоимость
     двух взрослых путевок входит
     цена одной детской
     (до 7лет)</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>2</IDTOUR>
    <NAME>Греция</NAME>
    <PRICE>32 000,00р. </PRICE>
    <INFORMATION>В августе
     и сентябре действуют
     специальные
     скидки</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>3</IDTOUR>
    <NAME>Таиланд</NAME>
    <PRICE>30 000,00р.</PRICE>
    <INFORMATION>Не включая
     стоимость
     авиабилета</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>4</IDTOUR>
    <NAME>Италия</NAME>
    <PRICE>26 000,00р.</PRICE>
    <INFORMATION>Завтрак
     в отеле включен в стоимость
     путевки</INFORMATION>
    </TOUR>
    <TOUR>
    <IDTOUR>5</IDTOUR>
    <NAME>Франция</NAME>
    <PRICE>27 000,00р.</PRICE>
    <INFORMATION>Дополнительные
     экскурсии не входят в стоимость
     путевки</INFORMATION>
    </TOUR>
    </TABLE>
    <?xml version="1.0"
     encoding="UTF-8" ?>
    <xsl:stylesheet
     xmlns:xsl=
     "http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    
    <xsl:template match="/"> 
    <H3>Таблица "Туры"</H3> 
    <xsl:apply-templates
     select="TABLE/TOUR"/>  
    
    </xsl:template>  
    <xsl:template match="TOUR"> 
    
    <P>
    <SPAN STYLE=
     "font-style:italic">Код тура:  </SPAN>
    <xsl:value-of select=
     "IDTOUR"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Название:</SPAN> 
    <xsl:value-of select = "NAME"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">
     Цена: </SPAN> 
    <xsl:value-of select=
     "PRICE"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Информация:</SPAN> 
    <xsl:value-of select=
     "INFORMATION"/><BR/>  
    </P>
    
    </xsl:template>  
    </xsl:stylesheet>

    Таблица стилей XSLTour3.xsl включает в себя два шаблона. Первый шаблон содержит инструкции для отображения коревого элемента - на это указывает атрибут match="/". Этот шаблон мы уже встречали ранее. Второй шаблон содержит инструкции для отображения элемента TOUR (атрибут match="TOUR" ). Сначала браузер обрабатывает шаблон, соответствующий корневой части элемента:

    <xsl:template match="/"> 
    <H3>Таблица "Туры"</H3> 
    <xsl:apply-templates select="TABLE/TOUR" /> 
    
    </xsl:template>

    Элемент apply-templates сообщает браузеру, что для каждого элемента TOUR внутри корневого элемента TABLE он должен обрабатывать шаблон, отвечающий элементу TOUR, - т. е. шаблон, для атрибута match которого установлено значение "TOUR". Далее описывается таблица стилей для этого элемента:

    <xsl:template match="TOUR"> 
    
    <P>
    <SPAN STYLE="font-style:italic">Код тура: </SPAN>
    <xsl:value-of select="IDTOUR"/><BR/> 
    <SPAN STYLE="font-style:italic">Название: </SPAN> 
    <xsl:value-of select = "NAME"/> <BR/> 
    <SPAN STYLE="font-style:italic"> Цена: </SPAN> 
    <xsl:value-of select="PRICE"/><BR/> 
    <SPAN STYLE="font-style:italic">Информация: </SPAN> 
    <xsl:value-of select="INFORMATION"/><BR/> 
    </P>
    
    </xsl:template>

    Доступ к дочерним элементам TOUR осуществляется посредством образца, содержащего только имя элемента:

    <xsl:value-of select="IDTOUR"/>

    В программном обеспечении к курсу вы найдете файлы XMLTour3.xml и XSLTour3.xsl в папке SomeTemplate (Code\Glava5\XSL\ SomeTemplate).

    Для создания таблиц XSL в среде Visual Studio .NET предусмотрен общий шаблон XSLT-документов. При запуске переходим в пункт главного меню "File \ New \ File" (см. рис. 10.3) и в появившемся списке шаблонов выбираем XSLT File. Сгенерированный текст содержит основные определения, для создания файла XSL следует лишь указать пространство имен XSL (таблица 10.10):

    Шаблоны XSLT и XSL
    XSLT-шаблон Visual Studio.NET
    <?xml version="1.0"
     encoding="UTF-8" ?>
    <stylesheet version="1.0"
     xmlns="http://www.w3.org/1999/XSL/Transform">
    
    </stylesheet>
    XSL-таблица стилей
    <?xml version="1.0"
     encoding="UTF-8" ?>
    <xsl:stylesheet xmlns:xsl=
     "http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    
    </xsl:stylesheet>

    Атрибуты XML-документов

    Атрибуты или свойства HTML-элементов представляют собой наиболее наглядное понятие - мы сталкивались с ними при определении фонового цвета странички "Пример HTML-документа.htm":

    <BODY BGCOLOR = LIGHTGREY>

    при определении шрифта и его цвета:

    <FONT COLOR = RED SIZE = 16 FACE = ARIAL>

    Описание атрибута представляет собой пару "имя (BGCOLOR) - значение (LIGHTGREY)", атрибуты отвечают в основном за вид элементов на web-странице (см. рис. 10.2).

    Атрибуты для XML-элементов предназначены для более широкого спектра задач, это своеобразные метки, по которым можно как форматировать затем элемент, применяя CSS или XSL, так и группировать. Они также используются для хранения различных свойств элемента, однако эти свойства не обязательно будут отображены. В спецификации XML не установлено строгих разграничений относительно типа информации, которую можно описывать с помощью атрибутов или внутри содержимого элемента.

    Описание атрибута состоит из имени атрибута, вслед за которым идет знак равенства и значение атрибута. Можно выбирать любое имя атрибута, придерживаясь при этом следующих правил (таблица 10.11).

    Некоторые правила для атрибутов XML-документов
    ПравилоПравильноНеправильно
    Имя атрибута должно начинаться с буквы или символа подчеркивания (_), после чего могут следовать другие буквы, цифры, символы точки (.), тире (-) или подчеркивания
    <TOUR _Open =
     "yes">
    <TOUR 1Open =
     "yes">
    Каждое имя атрибута может только один раз присутствовать в одном и том же начальном теге или в теге пустого элемента
    <TOUR Open =
     "yes">
    <TOUR Open =
     "yes" Open ="undefined" >
    Значение атрибута должно быть заключено в одинарные (') или в двойные кавычки (")
    <TOUR Open =
     "yes"> или
    <TOUR Open =
     'yes'>
    <TOUR Open =
     yes>
    Значение атрибута не может содержать внутри себя тот же символ кавычек, которыми оно ограничено
    <TOUR Open =
     '"yes"'> или
    <TOUR Open =
     "Only 'yes' allowed">
    <TOUR Open =
     ' 'yes' '> или
    <TOUR Open =
     ""yes"">или
    <TOUR Open =
     "Only "yes" allowed">
    Значение атрибута не может содержать символ < (синтаксический анализатор может воспринять этот символ как начало описания XML-разметки)
    <TOUR Open =
     "yes">
    <TOUR Open =
     "<yes>">

    Среда Visual Studio .NET выделяет атрибуты красным шрифтом, при просмотре XML-документа их легко выделять. Мы уже сталкивались с атрибутами при создании самого первого XML-документа:

    <?xml version="1.0" encoding="utf-8" ?>

    Здесь version и encoding - атрибуты, а "1.0" и "utf-8" - их значения соответственно.

    Применение атрибутов в XSL-схемах для фильтрации выводимого содержимого

    Мы уже отмечали преимущества использования XSL-таблиц перед таблицами каскадных стилей. Содержимое XML может фильтроваться или сортироваться при выводе с помощью XSL-таблиц. Пример подобной фильтрации реализован в таблице 10.12.

    XML-документ, XMLTour4.xmlXSL-таблица, XSLTour4.xsl
    <?xml version="1.0"
     encoding="utf-8" ?>
    
    <!-- Название файла XMLTour.xml  -->
    <?xml-stylesheet type="text/xsl"
     href="XSLTour4.xsl"?>
        
    <TABLE>
    <TOUR Open = "yes">
    <IDTOUR>1</IDTOUR>
    <NAME>Кипр</NAME>
    <PRICE>25 000,00р. </PRICE>
    <INFORMfTION>В стоимость
     двух взрослых путевок входит
     цена одной детской
     (до 7лет)</INFORMfTION>
    </TOUR>
    <TOUR>
    <IDTOUR>2</IDTOUR>
    <NAME>Греция</NAME>
    <PRICE>32 000,00р. </PRICE>
    <INFORMfTION>В августе
     и сентябре действуют 
     специальные
     скидки</INFORMfTION>
    </TOUR>
    <TOUR>
    <IDTOUR>3</IDTOUR>
    <NAME>Таиланд</NAME>
    <PRICE>30 000,00р.</PRICE>
    <INFORMfTION>Не включая
     стоимость
     авиабилета</INFORMfTION>
    </TOUR>
    <TOUR>
    <IDTOUR>4</IDTOUR>
    <NAME>Италия</NAME>
    <PRICE>26 000,00р.</PRICE>
    <INFORMfTION>Завтрак
     в отеле включен
     в стоимость
     путевки</INFORMfTION>
    </TOUR>
    <TOUR Open = "yes">
    <IDTOUR>5</IDTOUR>
    <NAME>Франция</NAME>
    <PRICE>27 000,00р.</PRICE>
    <INFORMATION>Дополнительные
     экскурсии не входят
     в стоимость
     путевки</INFORMfTION>
    </TOUR>
    </TABLE>
    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet
     xmlns:xsl=
     "http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    
    <xsl:template match="/"> 
    <H3>Таблица "Туры"</H3> 
    <xsl:for-each select="TABLE/TOUR[@ Open =
     'yes']"> <BR/>
     
    <SPAN STYLE=
     "font-style:italic">Код тура:  </SPAN>
    <xsl:value-of select="IDTOUR"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Название: </SPAN> 
    <xsl:value-of select =
     "NAME"/> <BR/>  
    <SPAN STYLE=
     "font-style:italic"> Цена: </SPAN> 
    <xsl:value-of select=
     "PRICE"/><BR/>  
    <SPAN STYLE=
     "font-style:italic">Информация: </SPAN> 
    <xsl:value-of select=
     "INFORMATION"/><BR/>  
    </xsl:for-each>  
    </xsl:template>  
    </xsl:stylesheet>
    Вид в браузере Internet Explorer

    Исходные документы XMLTour2.xml и XSLTour2.xsl были взяты из таблицы 10.8. Для туров с кодами 1 и 5 в тегах TOUR добавлены атрибуты Open:

    ...
    <TOUR Open = "yes">
    		<IDTOUR>1</IDTOUR>
    ...
    <TOUR Open = "yes">
    		<IDTOUR>5</IDTOUR>
    ...

    Таблица XSL трактует атрибут, принадлежащий элементу в XML-документе, как дочерний элемент. Для ссылки на атрибут в образце XSL необходимо предварить имя атрибута символом @, - это указывает, что имя относится к атрибуту, а не к элементу:

    <xsl:for-each select="TABLE/TOUR[@ Open = 'yes']">

    В результате этого отбора были выведены только те элементы XML-документа, которые содержали описываемый атрибут.

    В программном обеспечении к курсу вы найдете файлы XMLTour4.xml и XSLTour4.xsl в папке AttXSL (Code\Glava5\XSL\ AttXSL).

    Вернуться к учебному плану