интерпретацию 'Hello, world!'
, когда мы преобразуем документ
<msg>Hello, world!</msg>
в документ вида:
<message>Hello, world!</message>
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='msg'>
<message>
<xsl:value-of select='.'/>
</message>
</xsl:template>
</xsl:stylesheet>
Исходный код, представленный выше, является хорошо оформленным XML-документом. Корневым его элементом является элемент xsl:stylesheet
, который и обозначает преобразование. Атрибут version
указывает на версию языка XSLT, в соответствии с которой был построен этот документ; помимо этого в элементе xsl:stylesheet
объявляется пространство имен с префиксом xsl
, которому соответствует URI 'http://www.w3.org/1999/XSL/Transform'
. Все элементы преобразования, принадлежащие пространству имен с этим URI, будут восприняты процессором, как принадлежащие языку XSLT.
Элемент xsl:stylesheet
имеет один-единственный дочерний элемент xsl:template
, который и задает правило преобразования. Атрибут match
указывает, что это правило должно обрабатывать элемент msg
. Содержимое xsl:template
является телом шаблона. Оно выполняется тогда, когда сам шаблон применяется к некоторой части документа. В данном случае тело шаблона будет выполнено, когда само правило будет применяться к элементу msg
.
Телом шаблона является элемент message
. В терминах XSLT, этот элемент является литеральным элементом результата: он не принадлежит пространству имен XSLT и поэтому при обработке будет просто скопирован в результирующий документ. Содержимое этого элемента будет также обработано и включено в его сгенерированную копию.
Содержимым элемента message
является элемент xsl:value-of
, который, в отличие от message
принадлежит XSLT. Элемент xsl:value-of
вычисляет XPath-выражение, заданное в его атрибуте select
, и возвращает результат этого вычисления. XPath-выражение, '.'
, указанное в select
, возвращает ту самую часть узла, которая обрабатывается в данный момент, иначе говоря — элемент msg
.
Переводя на русский язык все вышеперечисленное, можно сказать, что приведенное преобразование содержит единственное правило: если в документе встретится элемент msg
, создать в выходящем документе элемент message
и включить в него содержимое элемента msg
.
Синтаксис XSLT, являющийся чистым XML, может показаться для языка программирования не совсем обычным, однако, как показывает практика, вряд ли какой другой синтаксис был бы более удобным. В конце концов, XSLT — это, прежде всего преобразование XML-документов, и уж на чем, как не на XML описывать правила этого преобразования. Кроме того, XML- формат самого преобразования позволяет использовать для его представления те же модели данных, что и для преобразуемых документов.
Совсем иным является язык XPath, который представлен в нашем примере лаконичным выражением '.'
. XPath не придерживается XML-синтаксиса, напротив, он скорее похож на синтаксис путей в операционных системах —
В приведенном преобразовании участвовала и третья синтаксическая конструкция, которая называется в XSLT msg
, заданный в атрибуте match
элемента xsl:template
указывает, какая именно часть XML-документа должна быть обработана этим правилом. Синтаксически паттерны являются XPath-выражениями (но не наоборот), однако смысл их различается. XPath-выражения вычисляются и возвращают результат, паттерны же просто устанавливают соответствие некоторому образцу. В нашем преобразовании паттерн msg
указывает, что шаблон должен обрабатывать только элементы msg
и никакие другие.
Каждое из шаблонных правил может вызывать другие шаблонные правила — в этом случае результат выполнения вызванных шаблонов включается в результат выполнения шаблона, который их вызывал. Для того чтобы продемонстрировать этот принцип мы немного перепишем шаблон 'Hello, world!'
с тем, чтобы он возвращал результат в виде HTML-документа.
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/'>
<html>
<head>
<title>Message</title>
</head>
<body>
<xsl:apply-templates select='msg'/>
</body>
</html>
</xsl:template>
<xsl:template match='msg'>
<b>
<xsl:value-of select='.'/>
</b>
</xsl:template>
</xsl:stylesheet>
Результат применения этого преобразования к документу
<msg>Hello, world!</msg>
иллюстрирует листинг 2.3.
<html>
<head>
<title>Message</title>
</head>
<body>
<b>Hello, world!</b>
</body>
</html>
В это преобразование мы добавили еще одно шаблонное правило: