Вход/Регистрация
Технология XSLT
вернуться

Валиков Алексей Н.

Шрифт:

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

xsl:variable
вычисляет и сохраняет в переменной
gv
длинную и громоздкую ссылку:

<xsl:variable name="gv"

 select="concat('http://host.com:8080/GeoView/GeoView.jsp?',

 'Language=en&amp;',

 'SearchText=Select&amp;',

 'SearchTarget=mainFrame&amp;',

 'SearchURL=http://host.com:8080/servlet/upload')"/>

После такого определения применение этой ссылки в преобразовании становится удобным и лаконичным:

<а href="#" target="_blank">Launch GeoBrowser</a>

Второй типовой случай использования переменных также заметно облегчает создание выходящего дерева, делая этот процесс гибким и легко конфигурируемым. Примером формирования HTML-документа при помощи такого подхода может быть следующий шаблон:

<xsl:template match="/">

 <html>

<xsl:copy-of select="$head"/>

<xsl:copy-of select="$body"/>

 </html>

</xsl:template>

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

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

если

 условие1

то

 присвоить переменной1 значение 1

иначе

 присвоить переменной1 значение2

Для процедурного языка с изменяемыми переменными это не проблема. На Java такой код выглядел бы элементарно:

переменная1 = условие1 ? значение1 : значение2;

или чуть в более длинном варианте:

if (условие1)

 переменная1 = значение1;

else

 переменная1 = значение2;

Однако если бы в XSLT мы написали что-нибудь наподобие:

<xsl:choose>

 <xsl:when test="условие1">

<xsl:variable name="переменная1" select="значение1"/>

 </xsl:when>

 <xsl:otherwise>

<xsl:variable name="переменная1" select="значение2"/>

 </xsl:otherwise>

</xsl:choose>

то требуемого результата все равно не достигли бы по той простой причине, что определенные нами переменные были бы доступны только в своей области видимости, которая заканчивается закрывающими тегами элементов

xsl:when
и
xsl:otherwise
. Правильный шаблон для решения этой задачи выглядит следующим образом:

<xsl:variable name="переменная1">

 <xsl:choose>

<xsl:when test="условие1">

<xsl:copy-of select="значение1"/>

</xsl:when>

<xsl:otherwise>

<xsl:copy-of select="значение2"/>

</xsl:otherwise>

 </xsl:choose>

<xsl:variable>

Конечно, это не точно то же самое — на самом деле мы получаем не значение, а дерево, содержащее это значение, но для строковых и численных значений особой разницы нет: дерево будет вести себя точно так же, как число или строка. Для булевых значений и множеств узлов приходится изыскивать другие методы. Булевое значение можно выразить через условие, например:

  • Читать дальше
  • 1
  • ...
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: