было заимствовано из входящего документа. Оно было создано элементом
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
.
Виды выражений
Выражения языка XPath можно условно разделить на несколько основных типов:
□ пути выборки;
□ выражения фильтрации множеств;
□ выражения объединения множеств;
□ сравнения;
□ логические операции;
□ вызовы функций.
Рассмотрим подробно назначение и принципы работы каждого из типов выражений.
Пути выборки
Путь выборки является самым главным видом выражений, которые применяются в XSLT. Путь выборки в соответствии с некоторыми критериями выбирает множество узлов входящего документа.
Путь выборки может быть абсолютным (отсчитываться от корневого узла дерева) или относительным (отсчитываться от контекстного узла). Он может состоять из нескольких шагов выборки, каждый из которых относительно предыдущего шага (или начального узла) выбирает некоторое множество узлов. Результатом вычисления пути выборки является множество узлов, выбранное его последним шагом.
Пример
Предположим, что нам нужно получить узел элемента
title
, находящийся в элементе
head
, который находится в элементе
html
, находящемся в корне документа. Соответствующий путь выборки будет выглядеть как:
/html/head/title
Означает он примерно следующее:
□ "
/
" — ведущая косая черта обозначает абсолютный путь выборки, то есть путь, который отсчитывается от корневого узла;