Главная / XSLT / Переменные XSLT
Переменные XSLT PDF Печать E-mail
Статьи - XSLT

Прекрасно, что мы можем выполнить функцию, но дело кончилось константой, запрятанной в глубине таблицы стилей. Не лучше ли было бы задавать переменные в начале страницы? Конечно, да (см. листинг 34).


Листинг 34. Задание переменной

 

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns="http://www.w3.org/TR/xhtml1/strict"

xmlns:scaler = "com.backstop.RecipeScaler"

extension-element-prefixes="scaler">

 

<xsl:variable name="numberOfServings" select="3" />

 

<xsl:template match="/">

<html>

<head>

<title>Recipes</title>

</head>

<body>

 

<scaler:scaleMessage servings="$numberOfServings" />

 

<xsl:apply-templates select="/recipes/recipe"/>

</body>

</html>

</xsl:template>

 

<xsl:template match="recipe">

...

</xsl:template>

 

<xsl:template match="ingredients/ingredient">

 

<xsl:value-of select="scaler:scaleIngredient($numberOfServings,

./qty)"/>

<xsl:text> </xsl:text><xsl:value-of select="./unit"/>

<xsl:text> </xsl:text><xsl:value-of select="./food"/><br

/>

 

</xsl:template>

...

 

XSLT позволяет создавать переменные; в ссылке используется знак доллара ($), который можно увидеть в листинге. Если применить таблицу стилей, можно увидеть два эффекта (см. рисунок12).


Рисунок 12. Использование переменной
Использование переменной

Обратите внимание, что ингредиенты были умножены на количество порций, как и ожидалось. Однако если вы посмотрите внимательнее, то увидите, что элемент extension сработал неверно, приняв переменную за строку, вместо того чтобы использовать значение самой переменной. Это не сбой; спецификация не требует, чтобы процессор что-либо делал со значениями атрибутов перед обработкой элемента extension. Поэтому нам надо как-то избежать этой проблемы.

Условная обработка

Первое, чтомы можем сделать - это использовать условную обработку, чтобы сообщение отображалось, только если оно нужно. Например, см.листинг 35.


Листинг 35. Использование элемента if

 

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns="http://www.w3.org/TR/xhtml1/strict"

xmlns:scaler = "com.backstop.RecipeScaler"

extension-element-prefixes="scaler">

 

<xsl:variable name="numberOfServings" select="1" />

 

<xsl:template match="/">

 

<html>

<head>

<title>Recipes</title>

</head>

<body>

 

<xsl:if test="$numberOfServings > 1">

 

<scaler:scaleMessage servings="3" />

 

</xsl:if>

 

<xsl:apply-templates select="/recipes/recipe"/>

</body>

</html>

</xsl:template>

...

 

Содержимое элемента if, заданное атрибутом test, должно быть равно true (истина). Если это не так, что и произошло в данном случае, вывод не появится вовсе (см.рисунок 13).


Рисунок 13. Результаты предложения if
Результаты предложения if

В том виде, в каком оно написано, предложение не имеет особого смысла; если значение больше единицы, элемент extention отобразится со значением"3." Лучше использовать множественный выбор (см.листинг 36).


Листинг 36. Элемент choose

 

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns="http://www.w3.org/TR/xhtml1/strict"

xmlns:scaler = "com.backstop.RecipeScaler"

extension-element-prefixes="scaler">

 

<xsl:variable name="numberOfServings" select="3" />

 

<xsl:template match="/">

 

<html>

<head>

<title>Recipes</title>

</head>

<body>

 

<xsl:choose>

<xsl:when test="$numberOfServings < 1">

Recipes have been scaled by an invalid number.

</xsl:when>

<xsl:when test="$numberOfServings = 1">

</xsl:when>

<xsl:when test="$numberOfServings = 2">

<scaler:scaleMessage servings="2" />

</xsl:when>

<xsl:when test="$numberOfServings = 3">

<scaler:scaleMessage servings="3" />

</xsl:when>

<xsl:otherwise>

Recipes have been scaled for multiple portions.

</xsl:otherwise>

</xsl:choose>

 

<xsl:apply-templates select="/recipes/recipe"/>

</body>

</html>

</xsl:template>

...

 

В данном случае у нас имеется комбинация элементов if-then-else и предложения case из традиционных языков программирования. Элемент choose работает как контейнер, однако элемент when отображает его содержимое, только если его атрибут test равен true (истина).Наконец, если ни один из элементов when не равен true(истина), процессор отображает содержимое элемента otherwise.

Результат получается такой, какого следует ожидать (см. рисунок14).


Рисунок 14. Результат
Результат

Теперь вы можете более гибко задать отображение большего количества порций, или подстроиться под другие условия.

Заключение

Подведение итогов

Данное руководство позволило продвинуться от начального знакомства с преобразованиями XSLT до составления достаточно сложных таблиц стилей. Сначала вы познакомились с основами таблиц стилей, затем с выражениями XPath - одной из основ XSLT. В последней части данного руководства были рассмотрены некоторые более сложные аспекты таблиц стилей XSLT - переменные, условная обработка и расширения. В результате у вас теперь должно быть достаточно знаний, чтобы делать с таблицами стилей XSLT практически все необходимое - или хотя бы понимать, что еще надо выяснить, если столкнетесь с проблемой.

 

Добавить комментарий


Защитный код
Обновить