Выражения
Выражения
Многие из задач, которые, так или иначе, выполняются во время преобразования, связаны с вычислением выражений. Для этих целей в XSLT используется язык XPath, который помимо выбора множеств узлов дерева может также выполнять некоторые основные операции над данными.
Замечание
Несмотря на то, что XPath является самостоятельным языком, его роль в XSLT настолько велика, что здесь и далее мы будем рассматривать их как единое целое.
Можно выделить четыре основные задачи, для которых в преобразованиях используются выражения:
? выбор узлов для обработки;
? описание условий;
? вычисление строковых значений, которые затем будут использованы в выходящем дереве;
? вычисление множеств узлов, которые затем будут использованы в выходящем дереве.
Первая из задач непосредственно относится к самому процессу преобразования. Выражения, содержащиеся в атрибутах select элементов xsl:apply-templates и xsl:for-each, вычисляют множества, к узлам которых нужно применить шаблоны.
Пример
Листинг 3.16
<xsl:template match="HTML">
<html>
<xsl:apply-templates select="HEAD"/>
<xsl:apply-templates select="BODY"/>
</html>
</xsl:template>
В этом шаблонном правиле содержатся два элемента xsl:apply-templates, которые применяют шаблоны к множествам, выбранным выражениями HEAD и BODY соответственно.
Логические выражения XPath могут использоваться в качестве условий в таких элементах, как xsl:if и xsl:when, обеспечивая условную обработку.
Пример
Предположим, что нам нужно выводить различные сообщения в зависимости от возрастной информации, присутствующей во входящем документе:
Листинг 3.17. Входящий документ
<person>
<name>Johnny</name>
<age>19</age>
</person>
Листинг 3.18. Преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">
<xsl:if test="age >= 21">
<xsl:text>Welcome, </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>.</xsl:text>
</xsl:if>
<xsl:if test="age < 21">
<xsl:text>Sorry, </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>, access denied.</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Выделенные выражения age >= 21 и age < 21 (сущности > и < обозначают символы "<", и ">") определяют условия: содержимое первого элемента xsl:if будет выполняться, только если значение элемента age было не меньше 21; содержимое второго — только если значение age было строго меньше 21. Этот же самый шаблон может быть переписан с использованием элементов xsl:choose, xsl:when и xsl:otherwise.
Листинг 3.19
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">
<xsl:choose>
<xsl:when test="age >= 21">
<xsl:text>Welcome, </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>.</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>Sorry, </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>, access denied.</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Результатом этого преобразования будет текст
Sorry, Johnny, access denied.
В этой строке имя johnny было заимствовано из входящего документа. Оно было создано элементом xsl:value-of:
<xsl:value-of select="name"/>
Этот элемент вычислил значение выражения name, которое было указано в его атрибуте select, преобразовал результат вычисления в строку и создал в выходящем документе текстовый узел, содержащий вычисленное значение.
В данном случае выражение name использовалось для генерации символьных данных. Между тем, выражения вполне пригодны и для того, чтобы создавать в выходящем документе целые фрагменты:
Листинг 3.20. Преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">
<xsl:choose>
<xsl:when test="age >= 21">
<event type="access granted">
<xsl:copy-of select="name"/>
</event>
</xsl:when>
<xsl:otherwise>
<event type="access denied">
<xsl:copy-of select="name"/>
<reason type="underaged">
<xsl:copy-of select="age"/>
</reason>
</event>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Листинг 3.21. Выходящий документ
<event type="access denied">
<name>John</name>
<reason type="underaged">
<age>19</age>
</reason>
</event>
Элемент xsl:copy-of, который использовался в этом преобразовании, делает примерно то же самое, что и xsl:value-of — вычисляет значение выражения и включает его в дерево выходящего документа. Главным отличием xsl:copy-of является то, что при его выполнении вычисленное выражение не преобразуется в строку, что позволяет копировать в выходящее дерево множества узлов и результирующие фрагменты. В приведенном выше примере элементы name и age выходящего документа являются копиями элементов name и age входящего документа.
В преобразованиях выражения могут использоваться только в атрибутах элементов и никогда — в тексте самого преобразования. Элемент
<reason type="underaged">
age
</reason>
будет скопирован в выходящий документ, содержащий текст "age". Ни о каком вычислении выражения age речь, конечно же, не идет. Для того чтобы в результирующий документ был скопирован результат вычисления выражения, оно должно быть заключено в атрибут одного из вычисляющих элементов, например, xsl:copy-of:
<reason type="underaged">
<xsl:copy-of select="age"/>
</reason>
В этом случае в элемент reason будет включен результат вычисления выражения age.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
CSS-выражения
CSS-выражения CSS-выражения (англ. CSS expressions) были впервые представлены в Internet Explorer 5.0, который позволял назначать JavaScript-выражение в качестве CSS-свойства. Например, следующий код позволит выставить позицию элемента в зависимости от того, какого размера окно браузера.#myDiv {position:
Выражения
Выражения ifПозволяет организовывать выполнение фрагментов кода по условию.Синтаксис :if (выражение) statementМожет иметь неограниченную степень вложенности в другие IF.if($a > $b) print "$a больше $b";<?phpif($a > $b) { echo "$a больше $b; $b=$a;}?>elseРасширяет возможности IF по части обработки
R.17.2 Выражения
R.17.2 Выражения выражение: выражение-присваивания выражение , выражение-присваиваниявыражение-присваивания: выражение-условия унарное-выражение операция-присваивания выражение-присваиванияоперация-присваивания: один из = *= /= %= += -= ››= ‹‹= &= ^=
Выражения
Выражения Выражение представляет собой объединение операций и операндов. (Напомним, что операндом называется то, над чем выполняется операция.) Простейшее выражение состоит из одного операнда, отталкиваясь от него, вы можете строить более сложные конструкции.
ВЫРАЖЕНИЯ
ВЫРАЖЕНИЯ Введение Выражение — это комбинация операндов и операций, задающая порядок вычисления некоторого значения. Операции определяют действия, выполняемые над операндами. Операнд в простейшем случае является константой или переменной. В общем случае каждый
Индексные выражения
Индексные выражения Синтаксис:<выражение1>[<выражение2>]Здесь квадратные скобки являются символами языка Си, а не элементами описания.Значение индексного выражения находится по адресу, который вычисляется как сумма значений <выражения1> и <выражения2>.
Операции и L-выражения
Операции и L-выражения В зависимости от используемых операций выражения подразделяются на первичные, унарные, бинарные, тернарные, выражения присваивания и выражения приведения типа.Первичные выражения рассмотрены в разделах 4.2.4, 4.2.5, 4.2.6.Унарное выражение состоит из
4. Выражения
4. Выражения В главе 3 мы рассмотрели типы данных – как встроенные, так и предоставленные стандартной библиотекой. Здесь мы разберем предопределенные операции, такие, как сложение, вычитание, сравнение и т.п., рассмотрим их приоритеты. Скажем, результатом выражения 3+4*5
Выражения
Выражения Многие из задач, которые, так или иначе, выполняются во время преобразования, связаны с вычислением выражений. Для этих целей в XSLT используется язык XPath, который помимо выбора множеств узлов дерева может также выполнять некоторые основные операции над
7. Выражения
7. Выражения Приоритет операций в выраженях такой же, как и порядок главных подразделов в этом разделе, наибольший приоритет у первого. Так например, выражения, о которых говорится как об операндах операции + (#7.4) – это те выражения, которые опрделены в ##7.1-7.4. Внутри каждого
7.1 Основные Выражения
7.1 Основные Выражения Основные выражения, включающие в себя . , -» , индексрование и вызовы функций, группируются слева направо.список_выражений: выражение список_выражений , выражениеid: идентификатор имя_функции_операции typedef-имя :: идентификатор typedef-имя ::
14.1 Выражения
14.1 Выражения выражение: терм выражение бинарная_операция выражение выражение ? выражение : выражение список_выраженийсписок_выражений: выражение список_выражений , выражениетерм: первичное_выражение унарная_операция терм терм ++ терм – sizeof выражение sizeof ( имя_типа ) (
Выражения
Выражения Выражение задает вычисление, вырабатывающее значение, - объект или ссылку на объект. Выражениями являются:[x]. неименованные (манифестные) константы;[x]. сущности (атрибуты, локальные сущности, формальные аргументы, Result);[x]. вызовы функций;[x]. выражения с