Замечание
Несмотря на то, что XPath является самостоятельным языком, его роль в XSLT настолько велика, что здесь и далее мы будем рассматривать их как единое целое.
Можно выделить четыре основные задачи, для которых в преобразованиях используются выражения:
□ выбор узлов для обработки;
□ описание условий;
□ вычисление строковых значений, которые затем будут использованы в выходящем дереве;
□ вычисление множеств узлов, которые затем будут использованы в выходящем дереве.
Первая из задач непосредственно относится к самому процессу преобразования. Выражения, содержащиеся в атрибутах selectэлементов xsl:apply-templatesи xsl:for-each, вычисляют множества, к узлам которых нужно применить шаблоны.
Пример
Листинг 3.16
В этом шаблонном правиле содержатся два элемента xsl:apply-templates, которые применяют шаблоны к множествам, выбранным выражениями HEADи BODYсоответственно.
Логические выражения XPath могут использоваться в качестве условий в таких элементах, как xsl:ifи xsl:when, обеспечивая условную обработку.
Пример
Предположим, что нам нужно выводить различные сообщения в зависимости от возрастной информации, присутствующей во входящем документе:
Листинг 3.17. Входящий документ
Johnny
19
Листинг 3.18. Преобразование
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Welcome,
.
Sorry,
, access denied.
Выделенные выражения age >= 21и age < 21(сущности >и <обозначают символы " <", и " >") определяют условия: содержимое первого элемента xsl:ifбудет выполняться, только если значение элемента ageбыло не меньше 21; содержимое второго — только если значение ageбыло строго меньше 21. Этот же самый шаблон может быть переписан с использованием элементов xsl:choose, xsl:whenи xsl:otherwise.
Листинг 3.19
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Welcome,
.
Sorry,
, access denied.
Результатом этого преобразования будет текст
Sorry, Johnny, access denied.
В этой строке имя johnnyбыло заимствовано из входящего документа. Оно было создано элементом xsl:value-of:
Этот элемент вычислил значение выражения name, которое было указано в его атрибуте select, преобразовал результат вычисления в строку и создал в выходящем документе текстовый узел, содержащий вычисленное значение.
В данном случае выражение nameиспользовалось для генерации символьных данных. Между тем, выражения вполне пригодны и для того, чтобы создавать в выходящем документе целые фрагменты:
Листинг 3.20. Преобразование
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Листинг 3.21. Выходящий документ
John
19
Элемент xsl:copy-of, который использовался в этом преобразовании, делает примерно то же самое, что и xsl:value-of— вычисляет значение выражения и включает его в дерево выходящего документа. Главным отличием xsl:copy-ofявляется то, что при его выполнении вычисленное выражение не преобразуется в строку, что позволяет копировать в выходящее дерево множества узлов и результирующие фрагменты. В приведенном выше примере элементы nameи ageвыходящего документа являются копиями элементов nameи ageвходящего документа.
В преобразованиях выражения могут использоваться только в атрибутах элементов и никогда — в тексте самого преобразования. Элемент
age
будет скопирован в выходящий документ, содержащий текст " age". Ни о каком вычислении выражения ageречь, конечно же, не идет. Для того чтобы в результирующий документ был скопирован результат вычисления выражения, оно должно быть заключено в атрибут одного из вычисляющих элементов, например, xsl:copy-of:
В этом случае в элемент reason будет включен результат вычисления выражения age.
Выражения языка XPath можно условно разделить на несколько основных типов:
□ пути выборки;
□ выражения фильтрации множеств;
□ выражения объединения множеств;
□ сравнения;
□ логические операции;
□ вызовы функций.
Рассмотрим подробно назначение и принципы работы каждого из типов выражений.
Читать дальше