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