Трансформация документа XML
Элементы, объявленные в XSLT
Язык XSLT объявляет около полусотни элементов. Из них 17 элементов верхнего уровня, которые могут быть непосредственно вложены в корневой элемент xsl:stylesheet таблицы стилей. Они называются декларациями. Это элементы xsl: import, xsl: include, xsl: attribute-set, xsl:character-map, xsl:date-format, xsl:decimal-format, xsl:function, xsl:import-schema, xsl:key, xsl:namespace-alias, xsl:output, xsl:param, xsl:preserve-space, xsl:sort-key, xsl:strip-space, xsl:template, xsl:variable. Более того, все эти элементы, кроме xsl:param и xsl: variable, можно записывать только на верхнем уровне вложенности, непосредственно в корневом элементе xsl:stylesheet.
Кроме элементов верхнего уровня вложенности, в языке XSLT объявлено более тридцати элементов, которые можно записывать в теле элементов верхнего уровня. Наиболее часто применяются элементы xsl:apply-templates, xsl:value-of, xsl:copy-of, xsl:sort, xsl:text.
Из всех элементов XSLT не верхнего уровня вложенности выделяются инструкции. Не путайте инструкции XSLT и инструкции по обработке XML. Формально инструкции XSLT определяются как элементы, которые можно вставлять в конструктор последовательности. К инструкциям, в частности, относятся элементы, создающие узлы всех семи видов и последовательности узлов. Это элементы xsl:element, xsl:attribute, xsl:text, xsl:comment, xsl:processing-instruction, xsl:namespace, xsl:result-document, xsl:sequence.
Кроме них, инструкциями считаются элементы xsl:apply-templates, x sl: value-of, xsl: variable и др., всего более двадцати элементов. К инструкциям относятся как элементы, управляющие выбором правил преобразовании xsl:if, xsl:for-each, xsl:choose, так и элементы, копирующие узлы xsl:copy, xsl:copy-of.
Все элементы необязательны и могут располагаться в любом порядке, за одним исключением: декларации xsl:import, если они есть, должны быть записаны первыми.
Рассмотрим некоторые наиболее часто применяемые элементы XSLT.
Декларация xsl:import
Элемент xsl:import записывается очень просто:
<хsl:import href="адрес URI таблицы стилей" />
Его можно записать только непосредственно в корневом элементе xsl:stylesheet и только в самом начале таблицы стилей. Элементов xsl: import может быть несколько.
Процессор XSLT отыскивает таблицу стилей по указанному атрибутом href адресу и подставляет ее на место элемента xsl:import перед преобразованием.
Некоторые правила преобразования из таблиц, импортируемых элементами xsl:import, могут конфликтовать с правилами, импортированными из других таблиц или определенными в самой таблице стилей. В таком случае чаще всего применяются те правила, которые записаны последними. Поэтому порядок записи элементов xsl:import в таблицу стилей имеет большое значение.
Декларация xsl:include
Второй элемент, включающий внешние таблицы стилей в данную таблицу, - это элемент xsl:include. Он записывается точно так же, как элемент xsl:import, и оказывает такое же действие:
<xsl:include href="адрес URI таблицы стилей" />
Его можно записать не только непосредственно в корневом элементе xsl:stylesheet, но, в отличие от элемента xsl:import, в любом месте таблицы стилей. Второе отличие от элемента xsl:import заключается в том, что порядок записи элементов xsl:include в таблице стилей не имеет значения.
Декларация xsl:variable
Элемент xsl:variable определяет имя объекта. Оно записывается обязательным атрибутом name. Имя объекта должно быть уточненным именем XML типа QName. Кроме того, атрибутом select переменной можно задать сам объект, а атрибутом as определить тип объекта. Например:
<xsl:variable name="var1" select="count(//person)" as="xs:integer" />
Имя var1 будет хранить число элементов person. Объект может быть получен из содержимого элемента xsl: variable:
<xsl: variable name="var2">10</xsl:variable>
или создан конструктором последовательности:
<xsl:variable name="var3"> <xsl:value-of select="count (//person) " /> <xsl:variable>
Если объект не получен из атрибута select или содержимого элемента xsl: variable, то по умолчанию имя связывается с пустой строкой.
Для того чтобы получить объект, связанный с именем, определенным элементом xsl: variable, перед именем надо поставить знак доллара: $varl, $var2. При этом следует учитывать область действия имени.
Область действия имени простирается на весь элемент, в котором оно определено, начиная с места определения и включая вложенные элементы, если только в них не определено то же самое имя.
Имена, определенные непосредственно в корневом элементе xsl:stylesheet, называются глобальными именами, остальные - локальными именами.
Хотя слово "variable" и переводится с английского языка как "переменная", имя, созданное элементом xsl: variable - это не имя переменной, его значение нельзя изменить. Это только название некоторого объекта, которое удобно использовать в тех случаях, когда объект надо использовать во многих местах таблицы стилей, а его вычисление сложно или громоздко.
Декларация xsl:param
Элемент xsl:param записывается или непосредственно в элементе xsl:stylesheet, чтобы задать параметр преобразования, или в элементе xsl:template, чтобы задать параметр правила, или в элементе xsl:function как аргумент функции. У него один обязательный атрибут name, определяющий имя параметра. Кроме него, часто присутствует необязательный атрибут select, в котором записывается выражение для получения значения параметра:
<xsl:param name="pl" select="10 + 20" />
Если атрибут select отсутствует, то значение параметра берется из содержимого элемента, которым может быть конструктор последовательности узлов и атомарных значений:
<xsl:param name="p2">10</xsl:param>
Если отсутствует и атрибут select, и содержимое элемента, то параметр получает значение пустой строки.
Дли получении значения параметра надо записывать его имя со знаком доллара: $p1,$p2. Например:
<xsl:when test= "$p1=10 ">
Правила, определяющие область видимости параметров, такие же, как и у имен объектов, определенных декларацией xsl:variable.
Еще один необязательный атрибут as содержит желательный тип, к которому будет приведено значение параметра.
Наконец, последний атрибут required, принимающий значения yes или nо (по умолчанию), указывает обязательность параметра. Если параметр обязателен, required="yes", то элемент xsl:param должен быть пустым и не содержать атрибут select. В таком случае он получит определенное значение при вызове функции или элементом xsl:with-param при вызове шаблона.
Элемент xsl:with-param
Элемент xsl:with-param ссылается на некоторый параметр, имя которого записано в обязательном атрибуте name. Необязательным атрибутом select можно задать выражение, результат вычисления которого будет новым значением параметра:
<xsl:with-param name="pl" select="100 * 20" />
Новое значение можно задать и в содержимом элемента:
<xsl:with-param name="pl">100</xsl:with-param>
Элемент xsl:with-param используется только в инструкциях xsl:apply-templates, xsl:apply-imports, xsl:call-template.
Инструкция xsl:value-of
Элемент xsl:value-of вычисляет выражение, записанное в его обязательном атрибуте select, и преобразует его в строку. Например, выше мы определили имя объекта var2. Чтобы получить значение объекта var2, надо записать:
<xsl:value-of select="$var2" /></example>
Если в результате вычисления выражения получается последовательность, то процессор XSLT версии 1.0 выберет из нее только первый элемент, преобразованный в строку.