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