Опубликован: 08.08.2007 | Доступ: свободный | Студентов: 1666 / 173 | Оценка: 3.86 / 3.76 | Длительность: 11:46:00
Специальности: Программист
Лекция 10:

Трансформация документа XML

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >
Инструкции управления xsl:if, xsl:for-each, xsl:choose

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

<xsl:if test="$x > $у">
<xsl:value-of select="$x"/> больше <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">Cyббота</xsl:when>
<xsl when test="$day=7">Воскресенье</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 name= " usr:sum "  as="xsl:integer">
<xsl:param name="x" as="xsl:integer" />
<xsl:param 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.

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >