MSXML3, Трансформируюсь!
АрхивПрограммазм (архив)Продолжаем серию статей об 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 и иметь доступ к группе профессионалов, которым всегда можно задать вопрос. Кстати, одним из постоянных участников списка является сам Майкл Кей.