Архивы: по дате | по разделам | по авторам

MSXML3, Трансформируюсь!

АрхивПрограммазм (архив)
автор : Дмитрий Качаев   09.04.2001

Продолжаем серию статей об XML технологиях. Краткое введение в язык eXstensible Stylesheet Language: Transformations.

Что такое XSLT?

Extensible Stylesheet Language: Transformations - это язык для преобразования XML документов из одного вида в другой. Очень часто новички, начиная изучать XML технологии, задаются вопросом: "В чем разница между XSL и XSLT?" Язык XSL состоит из двух частей и включает в себя языки XSL Transformations (XSLT) и XSL Formatting Objects, которые отвечают за трансформацию и форматирование XML документов соответственно.

Зачем нужен XSLT?

Язык XML является всего лишь языком для структурирования данных, и не предоставляет возможностей манипулирования данными. Для манипулирования данными нужно использовать такие программные интерфейсы (API), как DOM (Document Object Model) или SAX (Simple API for XML) с одной стороны, или язык XSLT с другой. Одним из преимуществ XSLT является то, что для работы с ним не надо уметь программировать на одном из высокоуровневых языков программирования типа Java, C++ или Visual Basic.

Рассмотрим пример использования языка XSTL:

Допустим, у нас есть статья, представленная в виде XML документа. При помощи XSL трансформации мы можем преобразовать ее в другой формат, например в HTML, PDF, обычный текст или какой-то другой. Стоит отметить, что в настоящее время XSLT в основном используется для преобразования XML документов либо в другие XML документы, либо в формат HTML для последующей их публикации в сети Интернет.

Что значит Transformation?

Язык XSLT, оперируя XML-документами, интерпретирует их в виде деревьев, содержащих элементы и атрибуты.

Рассмотрим пример того, как XML документ представляется в виде дерева:

В данном случае у нас есть корневой узел article типа element, и у него есть пять подузлов: два из них является узлами типа attribute - author и name, три из них - узлы part типа element, причем каждый из узлов part имеет подузел типа text.

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

XSLT документ, пример

Рассмотрим пример простого XSLT документа, преобразующего XML документ из предыдущего примера в HTML документ.

Как это работает, рассмотрим все по порядку

Как это работает, рассмотрим все по порядку

<?xml version="1.0"?>

Это стандартный заголовок, который должен содержать каждый XML документ. XSLT документы, также являются правильными XML документами, поэтому они должны удовлетворять всем требованиям, предъявляемым к XML документам. В заголовке также можно указывать кодировку документа, для этого нужно добавить атрибут encoding, например encoding="windows-1251" для русской Windows-кодировки.

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

Это стандартный заголовок XSLT документа, тэг stylesheet всегда является корневым тэгом в XSLT документах. Атрибут xmlns:xsl - это объявление пространства имен (namespace declaration), которое показывает, что префикс xsl используется для элементов, описанных в XSLT спецификации W3C.

<xsl:template match="/">

Элемент xsl:template задает правило, которое обрабатывает отдельную часть документа, которая задается с помощью атрибута match. "/" - это XPath выражение, задающее часть документа, подлежащую обработке, в данном случае это корневой элемент XML документа.

<html>
	<head>
		<title><xsl:value-of 
                 select="/article/@name"/></title>
	</head>
	<body>
	 <b><xsl:value-of select="/article/@name"/> 
         by <xsl:value-of select="/article/@author"/></b>
	  <xsl:apply-templates select="/article/part"/>
	</body>
</html>

В этой части все HTML тэги напрямую копируются в результирующее дерево, т.е. в выходной документ. Элемент xsl:value-of заменяется на значение, задаваемое XPath выражением, которое задает атрибут select. В нашем случае /article/@name есть значение атрибута name, содержащегося в элементе article, который, в свою очередь, является корневым элементом, аналогично /article/@author задает атрибут author в том же элементе.

<xsl:apply-templates select="/article/part"/>

Данный элемент дает команду XSLT процессору найти и обработать части документа, задаваемые XPath выражением, описанным в атрибуте select. В нашем случае для всех элементов part, содержащихся в корневом элементе article, вызывается правило, указанное ниже.

</xsl:template>

Закрывающий тэг.

<xsl:template match="part">
	<p>
		<xsl:value-of select="./text()"/>
	</p>
</xsl:template>

Данное правило применяется ко всем элементам part, когда XSLT процессор хочет их обработать. Данное правило заключает текстовое содержание элемента part в HTML тэги параграфа.

</xsl:stylesheet>

Закрывающий тэг корневого элемента.

Как запустить пример?

В первую очередь, у вас должен стоять XSLT процессор. В качестве XSLT процессора можно использовать MSXML3, для этого его нужно установить, как это описано в предыдущей статье "MSXML3, Первое знакомство".

Для того, чтобы MSXML3 знал, с помощью какого XSLT документа обрабатывать XML документ, необходимо сразу после стандартного XML заголовка вставить инструкцию процессора <?xml-stylesheet type="text/xsl" href="sample.xsl"?>, где атрибут href содержит абсолютную или относительную ссылку на XSLT документ. Теперь при открытии этого XML документа с помощью Internet Explorer XSLT процессор, встроенный в MSXML3, автоматически трансформирует исходный XML документ в HTML документ с помощью указанного нами XSLT документа.

Язык XPath и шаблоны

Язык XPath предназначен для адресации частей XML документа и применяется, в частности, в языке XSLT. Другими словами, язык XPath позволяет производить выборку узлов дерева, представляющего XML документ.

Как видно из вышеприведенного примера, структуру XSLT документа можно представить как корневой элемент xsl:stylesheet, в который вложен набор правил, заданных элементами xsl:template, на основании которых трансформируется исходный XML документ. Пожалуй, самой важной частью правила является условие его применимости, т.е. указание того, к каким узлам исходного дерева нужно его применять. Это условие задается в атрибуте match элемента xsl:template. Значение этого атрибута является XPath выражением и его принято называть шаблоном (XSLT pattern). Шаблоны отличаются от XPath выражений тем, что при их записи используется несколько ограниченный язык XPath.

Рассмотрим примеры шаблонов и укажем, каким узлам дерева исходного XML документа они соответствуют:

news - все элементы news исходного XML документа

article/para - все подэлементы para элемента article

book[author="Michael Kay"] - все элементы book, содержащие в себе элемент author, текстовое значение которого равно "Michael Kay"

favorites/link[1] - все элементы link, которые являются первыми подэлементами элементов favorites

/ - корневой элемент

/root/* - все подэлементы корневого элемента root

//chapter - любой элемент chapter (// означает любой уровень вложенности элемента)

man[@name ='Vasya'] - любой элемент man, имеющий атрибут name равный 'Vasya'

root/node[position() mod 2 =0] - все подэлементы node, имеющие четное место среди других подэлементов узла root

Вместо заключения

Целью данной статьи являлось знакомство читателей с основами языка XSLT. Для того, чтобы более подробно изучить этот язык, я советую сделать следующее:

1. Обязательно купите, если вы еще этого не сделали, книгу Майкла Кея "XSLT, Programmers's Reference". Это замечательная, удобная, наиболее полная и достаточно легко читаемая книга. Рецензия, которую дают этой книге большинство специалистов, - "must have".

2. Если  вы не смогли достать книгу Майкла Кея, не расстраивайтесь.Очень подробное руководство с массой примеров с сайта www.zvon.org смогут частично компенсировать отсутствие хорошей книги.

3. Если вы новичок и у вас уже появились первые вопросы, обязательно загляните в Dave Pawson's XSL FAQ . Почти наверняка вы найдете там ответы на все ваши вопросы.

4. Подпишитесь на список рассылки об XSLT на сайте mulberrytech.com, чтобы получать ежедневную информацию о XSLT и иметь доступ к группе профессионалов, которым всегда можно задать вопрос. Кстати, одним из постоянных участников списка является сам Майкл Кей.

© ООО "Компьютерра-Онлайн", 1997-2024
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.