Глава 7 полностью посвящена XPath, но имеет смысл предоставить введение в предмет здесь, при обсуждении образцов, потому что часть предиката образца обладает наибольшими возможностями. В предикатах могут быть все виды выражений; в следующем списке перечислен ряд возможных типов, которые будут изучены в следующих разделах:
• наборы узлов;
• логические выражения;
• числа;
• строки.
Набор узлов (node set), как понятно из названия, представляет собой просто совокупность узлов (и может содержать только один узел). Выражение child::PLANET
возвращает набор узлов, состоящий из всех элементов . Выражение child::PLANET/child::NAME
возвращает список узлов, состоящий из всех элементов , дочерних по отношению к элементам . Для выбора узла или узлов из набора узлов воспользуйтесь следующими функциями для работы с наборами узлов в предикатах:
• last()
. Возвращает количество узлов в наборе узлов;
• position()
. Возвращает позицию контекстного узла в контекстном наборе узлов (начиная с 1);
• count(node-set)
. Возвращает количество узлов в наборе. Если опустить node-set
, функция будет применена к контекстному узлу;
• id(string ID)
. Возвращает набор узлов, содержащий элемент с ID, удовлетворяющим переданной функции строке, или пустой набор узлов, если такой элемент отсутствует. Можно перечислить несколько идентификаторов, разделенных символами-разделителями, — тогда функция вернет набор узлов, состоящий из элементов с этими идентификаторами;
• local-name(node-set)
. Возвращает локальное имя первого узла в наборе узлов. Если опустить node-set
, функция будет применена к контекстному узлу;
• namespace-uri(node-set)
. Возвращает URI пространства имен первого узла в наборе узлов. Если опустить node-set
, функция будет применена к контекстному узлу;
• name(node-set)
. Возвращает полностью определенное имя первого узла в наборе узлов. Если опустить node-set
, функция будет применена к контекстному узлу.
В листинге 4.6 я перенумеровал элементы в выходном документе при помощи функции position()
.
Листинг 4.6. Применение функции position
xmlns:xsl="http://www.w3.org/1999/XSL/Transform>
The Planets
Предикаты: логические значения
В выражениях XPath можно также использовать логические (Boolean) значения. Для чисел ноль принимается за ложь (false), другие значения — за истину (true). Пустая строка, "", также считается ложью, все остальные строки — истиной.
Для вычисления логических результатов true/false можно применять следующие логические операции XPath:
• != означает «не равно»;
• < означает «меньше, чем» (в документах XML или XSL используйте <);
• <= означает «меньше или равно» (в документах XML или XSL используйте <=);
• = означает «равно» (программисты на С, С++, Java и JavaScript, обратите внимание: эта операция пишется как один знак =, а не два);
• > означает «больше, чем»;
• >= означает «больше или равно».
ИСПОЛЬЗОВАНИЕ СИМВОЛА <
Особенно обратите внимание на то, что непосредственно в документах XML или XSL нельзя использовать символ <, необходимо использовать ссылку на сущность <.
Для связи логических выражений логическими операциями And и Or используются ключевые слова and и or; слово not инвертирует логический смысл выражения — с истины на ложь или со лжи на истину.
В листинге 4.7 я определяю элемент Земли и помещаю в таблицу строки " Earth
", " needs
", " no
" и " introduction
" вместо числовых данных Земли. Я определяю, которая из планет есть Земля, при помощи предиката "[NAME='Earth']"
, проверяющего значение элемента , которое, в свою очередь, представляет собой заключенный в элементе текст. Я также предоставил шаблон для других планет, удовлетворяющих предикату " [NAME!='Earth']
''.
Листинг 4.7. Определение планеты Земля
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets Table
The Planets Table
Earth |
needs |
no |
introduction. |
|
|
|
|
Вот результат:
The Planets Table
<���Н1>
The Planets Table
</Н1>
.
.
.
Name |
Mass |
Radius |
Day |
Earth |
needs |
no |
introduction. |
Результат можно увидеть на рис. 4.1.
Читать дальше