Опубликован: 08.08.2007 | Уровень: для всех | Доступ: платный
Лекция 12:

Лабораторная работа № 2

Элемент 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" />

Если в результате вычисления выражения получается последовательность, то процессор XSLT версии 1.0 выберет из нее только первый элемент, преобразованный в строку.

Инструкции управления xsl:if, xsl:for-each, xsl:choose

Элемент xsl:if запускает конструктор последовательности, содержащийся в его теле, только если истинно выражение, записанное в обязательном и единственном атрибуте test:

<xsl:if test="$x > $у">
<xsl:value-of select="$x"o/> больше <xsl:value-of select="$y" />
</xsl:if>  '

У элемента xsl:for-each в обязательном и единственном атрибуте select записывается выражение, дающее в результате последовательность. Для каждого члена этой последовательности выполняется конструктор, содержащийся в теле элемента xsl:for-each. В результате получается цикл, выполняющийся столько раз, сколько элементов у последовательности, полученной в результате вычисления выражения атрибута select.

У элемента xsl:choose нет ни одного атрибута, но в его теле записывается один или несколько элементов xsl: when и один необязательный элемент xsl:otherwise:

<xsl:choose>
<xsl when test="$day=l">Понедельник</xsl:when>
<xsl when test="$day=2">Bторник</xsl:when>
<xsl when test="$day=3">Cреда</xsl:when>
<xsl when test="$day=4">Четверг</xsl:when>
<xsl when test="$day=5">Пятница</xsl:when>
<xsl when test="$day=6">Cy66oтa</xsl:when>
<xsl when test="$day=7">Bocкpeceнье</xsl:when>
<xsl otherwise>Ошибка определения дня нeдeли</xsl:otherwise>
</xsl:choose>

У элемента xsl:when есть только один обязательный параметр test, содержащий логическое выражение, и тело, содержащее конструктор последовательности.

Элемент xsl: otherwise не имеет атрибутов, у него есть только тело, содержащее конструктор последовательности.

В инструкции xsl: choose всегда выполняется не больше одного варианта, Варианты xsl:when просматриваются в порядке их написания в инструкции xsl:choose. Как только будет найден вариант с истинным значением выражения test, он будет выполнен, и результат этого варианта будет результатом всей инструкции. Варианты, следующие за ним по порядку, не рассматриваются. Если ни один вариант не подойдет, то результатом инструкции будет результат конструктора, записанного в элементе xsl:otherwise. Если элемента xsl:otherwise в инструкции нет, то результатом будет пустая строка.

Декларация xsl:function

Элемент xsl:function позволяет описывать самые настоящие пользовательские функции. Имя функции записывается в обязательном атрибуте nаmе, (аргументы функции задаются элементами xsl:param, а тело функции - это конструктор последовательности, записанный в содержимом элементе xsl:function. Результатом функции будет последовательность, созданная конструктором. Тип функции можно указать необязательным атрибутом аs.

Имя функции - это уточненное имя типа QName, причем оно должно обязательно записываться с префиксом.

Все аргументы функции позиционные, следовательно, все элементы xsl:param должны быть записаны в начале тела функции и порядок их записи имеет значение при вызове функции. У аргументов функции не может быть значений по умолчанию, следовательно, элементы xsl:param должны быть пустыми и у них не должно быть атрибутов select. Например:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:usr="http://myexamples.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl: function nаme= " usr:sum "  as="xsl:integer">
<xsl:param name="x" as="xsl:integer" />
<хsl:раrаm name="y" as="xsl:integer" />
<xsl:value-of select="$x + $y" /> 
</xsl:function>

вызвать функцию можно в любом выражении подходящего типа, записав ее имя и аргументы в скобках. Например:

<хsl:value-of select="10 + 2 * usr:sum(2, 3)" />

Функция может вызываться рекурсивно.

Декларация xsl:template

Элемент xsl:template определяет шаблонное правило преобразования. Своим атрибутом match он задает образец для отбора узлов, подлежащих преобразованию, а в теле содержит конструктор последовательности узлов и атомарных значений, которая и будет результатом преобразования отобранных по образцу узлов.

<xsl: template match=" Образец" name="Имя">Конструктор</хsl:template>

Каждый из атрибутов match и name не обязателен, но хотя бы один из них должен присутствовать.

Атрибут match содержит образец для отбора преобразуемых узлов.

Атрибут name определяет имя шаблона. Имя шаблона - это обычное уточненное имя XML типа QName. Шаблон можно вызвать по имени элементом xsl:call-template, а если он не содержит атрибута match, то такой вызов обязателен, поскольку неизвестны узлы, к которым его надо применить, и он не будут применяться автоматически. Очень часто именованный шаблон содержит параметры, заданные элементами xsl:param, и вызывается с различным параметрами совсем как обычная функция.

У элемента xsl: template могут быть дополнительные атрибуты mode, as, priority.

Атрибут mode определяет режим обработки.

Атрибут as указывает желаемый тип результата (полученная последовательность будет приведена к этому типу).

Атрибут priority назначает правилу приоритет, который будет учитываться при отборе правил, применимых к некоторому узлу.

При вызове именованного шаблона элементов xsl:call-template атрибуты match, mode и priority игнорируются.

Если у именованного шаблона нет атрибута match, то у него не должно быть и атрибутов mode и priority, в них просто нет никакого смысла.

Инструкция xsl:apply-templates

Элемент xsl:apply-templates, записываемый чаще всего внутри элемента xsl: template, в простейшем виде пуст:

<xsl:apply-templates />

Он предписывает обработать рекурсивно все узлы-потомки узлов, отобранных родительским элементом xsl:template.

У элемента xsl:apply-templates есть необязательные атрибуты select и mode.

Атрибут select, значением которого должно быть выражение, дающее последовательность узлов, ограничивает обработку только указанными в нем узлами.

Атрибут mode выбирает режим обработки из режимов, уже определенных в элементах xsl:template. Режим - это любое имя типа QName, но два режима предопределены. Это текущий режим, отмечаемый словом #current, и режим по умолчанию, принимаемый при отсутствии атрибута mode, или отмечаемый явно словом #default.

Содержимым элемента xsl: apply-templates могут служить элементы xsl:sort и xsl:with-param.

Инструкция xsl:for-each-group

Элемент xsl:for-each-group отбирает последовательность узлов и атомарных значений своим обязательным атрибутом select и группирует ее элементы по признаку, заданному выражением, записанным в атрибуте group-by. Этот признак называется ключом группы. Ключ группы вычисляется заново для каждого элемента последовательности. В результате исходная последовательность, отобранная атрибутом select, разбивается на несколько последовательностей. В следующем примере в одну группу собираются все узлы-элементы name с одинаковым значением атрибута surname:

<xsl:for-each-group select="name" group-by="@surname">

Выражение, являющееся значением атрибута group-by, может давать несколько ключей группы, и один узел может попасть сразу в несколько групп. Например:

<xsl:for-each-group select="name" group-by="(@second, @surname)">

Второй способ разбить последовательность на группы дает атрибут group-adjacent. Он собирает в группу все подряд идущие элементы последовательности с одинаковым значением ключа. Такой отбор возможен, если в атрибуте group-adjacent содержится только один ключ группы. Процессор XSLT следит за тем, чтобы значением атрибута group-adjacent был один и только один ключ группы.

Третий и четвертый способы применимы к последовательностям, состоящим только из узлов, без атомарных значений. Эти способы применяют атрибут group-starting-with или атрибут group-ending-with. Значением этих атрибутов может быть не любое выражение, а только образец. В одну группу собираются все подряд идущие узлы, первый (последний) из которых удовлетворяет образцу. Остальные узлы из этой группы не будут удовлетворять образцу. Если несколько подряд идущих элементов последовательности удовлетворяют образцу, то они попадут в разные группы.

Итак, группы узлов создаются одним из четырех атрибутов элемента xsl:for-each-group: group-by, group-adjacent, group-starting-with, group-ending-with. В каждом элементе xsl:for-each-group должен быть один и только один из этих атрибутов. Полученные группы существуют и могут использоваться только в содержимом элемента xsl:for-each-group. В теле элемента xsl:for-each-group записывается конструктор последовательности, который выполняется по одному разу для каждой группы.

Для удобства работы с группами в язык XSLT введены функции current-group() и current-group-key ().Их можно использовать только в теле элемента xsl:for-each-group. У обеих функций нет аргументов. Результатом функции current-group() будет последовательность- текущая группа, а результатом функции current-group-key() - значение ключа текущей группы.

Вадим Новицкий
Вадим Новицкий
Беларусь, Минск
Trololo Пукпрук
Trololo Пукпрук
Беларусь