XSLT — страница 67 из 124

контекстного узла;

• 

..
возвращает родителя контекстного узла;

• 

../@UNITS
возвращает атрибут
UNITS
родителя контекстного узла;

• 

.//..
возвращает всех родителей потомка контекстного узла и родителя контекстного узла;

• 

PLANET[NAME]
возвращает детей
контекстного узла, у которых есть дети
;

• 

PLANET[NAME="Venus"]
возвращает детей
контекстного узла, у которых есть дети
с текстом, равным «Venus»;

• 

PLANET[@UNITS="days"]
возвращает всех детей
контекстного узла, у которых есть атрибут
UNITS
со значением «
days
»;

• 

PLANET[6][@UNITS="days"]
возвращает шестого ребенка
контекстного узла, только если у этого ребенка есть атрибут
UNITS
со значением «days». Можно также написать
PLANET[@UNITS="days"][6]
;

• 

PLANET[@COLOR and @UNITS]
возвращает всех детей
контекстного узла, у которых есть атрибут
COLOR
и атрибут
UNITS
;

• "

//PLANET[not(.=preceding::PLANET)]
" выбирает все элементы
, значение которых отлично от значения любого предшествующего элемента
;

• 

*[1][self::NAME]
выбирает любой элемент
, который является первым ребенком своего родителя;

• 

*[position() < 5][@UNITS]
выбирает первых пятерых детей контекстного узла, у которых есть атрибут
UNITS
.

Проверка выражений XPath

В пакет Xalan входит удобная программа-пример, ApplyXPath.java, позволяющая применить выражение XPath к документу и посмотреть на результат, что очень помогает при тестировании. Для запуска этого примера вам нужно будет скомпилировать

ApplyXPath.java
в
ApplyXPath.class
при помощи утилиты java.exe, входящей в поставку Java.

В качестве примера я применю выражение XPath «

PLANET/NAME
» к
planets.xml
при помощи
ApplyXPath.class
. Ниже показан результат, отображающий все элементы
, дочерние по отношению к элементам
(теги
добавлены программой ApplyXPath):

%java ApplyXPath planets.xml PLANET/NAME

MercuryVenusEarth

XPath 2.0

XPath находится в стадии обновления, и в него включаются средства поддержки XSLT 2.0 (см. www.w3.org/TR/xpath20req). Задачи XPath 2.0 следующие:

• упрощение операций с содержимым типов, поддерживаемых схемой XML;

• упрощение операций со строковым содержимым;

• поддержка соответствующих стандартов XML;

• улучшение удобства использования;

• улучшение функциональной совместимости;

• улучшение поддержки международных языковых средств;

• сохранение обратной совместимости;

• повышенная эффективность процессора.

Следующий список дает обзор требований XPath. Главные пункты — поддержка схемы XML и регулярных выражений, что дает средства работы со строками и поиска в строках. (Дополнительную информацию о регулярных выражениях можно почерпнуть по адресу http://www.perldoc.com/perl5.6/pod/perlre.html.) В соответствии с W3C, XPath 2.0:

• должен поддерживать архитектуру XML W3C, хорошо взаимодействуя с другими стандартами в семействе XML;

• должен выражать свою модель данных в терминах информационного множества (infoset) XML;

• должен предоставлять общий ключевой синтаксис для XSLT 2.0 и XML Query language 1.0;

• должен поддерживать явное сравнение «

for any
» или «
for all
» и синтаксис равенства;

• должен расширять множество функций агрегации (например, пользователи XSLT часто требовали добавить функции

min()
и
max()
);

• должен сохранять обратную совместимость с XPath 1.0;

• должен предоставлять функции пересечения и разности то есть — XPath 1.0 поддерживает объединение двух наборов узлов, и к этому должны быть добавлены функции пересечения и разности;

• должен поддерживать операцию унарного плюса (поскольку в схеме XML у десятичных чисел может присутствовать лидирующий плюс);

• должен улучшать удобство использования;

• должен снизить ограничения на шаги расположения;

• должен реализовывать условную операцию, оперирующую тремя выражениями — выражением 1 (логическая операция), выражением 2 и выражением 3. Если выражение 1 принимает значение «истина», должно вычисляться выражение 2, а если выражение 1 принимает значение «ложь», должно вычисляться выражение 3;

• должен определять последовательный синтаксис для подвыражений, обрабатывающих коллекции элементов;

• должен поддерживать дополнительные строковые функции. Например, W3C рассматривает вопрос добавления средств для замены в строках, заполнения символами и преобразований регистра;

• должен поддерживать функции агрегации при применении к коллекциям. Например, некоторым пользователям XPath 1.0 требовалось применить такую функцию агрегации, как

sum
, к значениям выражений, примененных к наборам узлов;

• должен поддерживать регулярные выражения для поиска в строках с использованием нотации регулярных выражений, установленной в схеме XML;

• должен поддерживать элементарные типы данных схемы XML. То есть в дополнение к типам, поддерживаемым моделью данных XPath 1.0, — строке, числу, логическому значению и набору узлов — модель данных XPath 2.0 должна поддерживать элементарные типы данных схемы XML;

• должен поддерживать представления чисел с плавающей точкой одинарной и двойной точности, поддерживаемые схемой XML, которая использует научную нотацию;

• должен определять подходящий набор функций для работы пользователя с элементарными типами данных схемы XML;

• должен добавлять в XPath тип данных «список» (поскольку схема XML позволяет определять простые типы, унаследованные от списка);

• должен поддерживать доступ к значениям простых типов элементов и атрибутов. Поскольку схемы XML представляют много новых типов, XPath 2.0 должен поддерживать доступ к собственному, простого типа, значению элемента или атрибута;

• должен определять поведение операторов для нулевых аргументов; 

• должен иметь средства для выбора элементов или атрибутов на основе явного типа схемы XML;

• должен иметь средства для выбора элементов или атрибутов на основе иерархии типов схемы XML;

• должен иметь средства для выбора элементов на основе групп подстановки схемы XML;

• должен поддерживать средства поиска, основанные на уникальных ограничениях и ключах схемы.

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

Глава 8Работа с функциями XSLT и XPath

В этой главе мы изучим доступные вам в XSLT функции — как встроенные в XSLT, так и функции XPath. Вы уже встречались с этими функциями выборочно (например, с

id
,
generate-id
,
position
,
count
и т.д). В этой главе мы рассмотрим их все.

Некоторые функции входят в XSLT, некоторые пришли из XPath. И XSLT, и XPath обновляются до версии 2.0, и в конце главы я приведу список новых, готовящихся к выпуску функций. (Пока что никаких новых функций версии 2.0 еще не опубликовано.)

В XSLT встроены следующие функции:

element-available()
;

function-available()
;

current()
;

document()
;

key()
;

format-number()