Сокращенный синтаксис XPath
Сокращения синтаксиса XPath могут быть весьма удобными. Ниже приведены правила:
Self::node() может быть сокращено как. ;
Parent::node() может быть сокращено как.. ;
Child::childname может быть сокращено как childname ;
Attribute::childname может быть сокращено как @childname ;
/descendant-or-self::node()/ может быть сокращено как // .
Например, путь расположения.//PLANET - сокращение для self::node()/descendant-or-self::node()/child::PLANET . Можно также сократить выражение предиката как , как и т.д. Работать с путями расположения XPath при помощи сокращенного синтаксиса значительно проще. В следующем списке перечислен ряд примеров путей расположения с использованием сокращенного синтаксиса:
PLANET возвращает дочерние элементы
* возвращает все дочерние элементы контекстного узла;
Text() возвращает все дочерние текстовые узлы контекстного узла;
@UNITS возвращает атрибут UNITS контекстного узла;
@* возвращает все атрибуты контекстного узла;
PLANET возвращает третьего ребенка
PLANET возвращает последнего ребенка
*/PLANET возвращает всех внуков
/PLANETS/PLANET/NAME возвращает второй элемент //PLANET возвращает всех потомков PLANETS//PLANET возвращает элементы-потомки //PLANET/NAME возвращает все элементы Возвращает сам контекстный узел; .//PLANET возвращает элементы-потомки Возвращает родителя контекстного узла; ../@UNITS возвращает атрибут UNITS родителя контекстного узла; .//.. возвращает всех родителей потомка контекстного узла и родителя контекстного узла; PLANET возвращает детей PLANET возвращает детей PLANET[@UNITS="days"] возвращает всех детей PLANET[@UNITS="days"] возвращает шестого ребенка PLANET[@COLOR and @UNITS] возвращает всех детей " //PLANET " выбирает все элементы * выбирает любой элемент *[@UNITS] выбирает первых пятерых детей контекстного узла, у которых есть атрибут UNITS . Сокращенный синтаксис
Для образцов существует два правила сокращения осей: child::childname может быть сокращено как childname; attribute::childname может быть сокращено как @childname.В следующем списке перечислен ряд примеров образцов с сокращенным синтаксисом; в конце главы вы увидите Сокращенный синтаксис предикатов
Выражения предикатов можно сокращать, опуская "position()=". Например, становится , становится и т.д. С использованием сокращенного синтаксиса применять выражения XPath в предикатах становится существенно проще. Вот ряд Числа XPath
В XPath числа хранятся в формате чисел с плавающей точкой двойной точности. В соответствии с формальным определением, числа XPath должны храниться в формате 64-разрядных чисел с плавающей точкой двойной точности IEEE 754, и все числа хранятся как числа с плавающей точкой Применение осей XPath
К этому моменту мы рассмотрели три части шагов расположения - ось, условие узла и предикат. Вы должны быть знакомы с этими элементами по проделанной нами работе с образцами выбора, но обратите внимание на ось в предыдущем примере - preceding-sibling. До сих пор Проверка выражений XPath
В пакет Xalan входит удобная программа-пример, ApplyXPath.java, позволяющая применить выражение XPath к документу и посмотреть на результат, что очень помогает при тестировании. Для запуска этого примера вам нужно будет скомпилировать ApplyXPath.java в ApplyXPath.class при Xpath
- декларативный язык запросов
к элементам xml
или (x)html
документа и xslt
преобразований. Полезные источники
: Полная спецификация по Xpath 1.0 на русском здесь - http://citforum.ru/internet/xpath/xpath.shtml. Xpath Online Tester - http://www.xpathtester.com/xpath/ Для поиска DOM элементов по Xpath в Firebug есть встроенная ф-ция: $x(xpath [, contextNode [, resultType]])
Тип результата: XPathResult.NUMBER_TYPE
XPathResult.STRING_TYPE
XPathResult.BOOLEAN_TYPE
XPathResult.FIRST_ORDERED_NODE_TYPE
XPathResult.UNORDERED_NODE_ITERATOR_TYPE
Пример использования XPATH запросов в Firebug: $x("//tr[@data-place]/@data-place").value
$x("string(//tr[@data-place]/@data-place)") P/ancestor::* # все родители (http://bit.ly/1ta7mh9)
p/following-sibling::* # все следующие братья
p/preceding-sibling::* # все предыдущие братья
p/following::* # все следующие элементы кроме потомков (http://bit.ly/1ta83H5)
p/preceding::* # все предыдущие элементы кроме предков
p/descendant-or-self::* # контекстный узел и все его потомки
p/ancestor-or-self::* # контекстный узел и все его предки
Указывает на фильтрацию элементов Input[@type=text] # атрибуты задаются с префиксом @
input[@class="OK"] #
p # параграфы без атрибутов
*[@style] # все элементы с атрибутом style
a[. = "OK"] # ссылки со значением "OK"
a/@id # идентификаторы ссылок
a/@* # все атрибуты ссылок
a[@id and @rel] # ссылки, которые содержат атрибуты id и rel
a[@id][@rel] # то же самое
a # ссылки содержат элемент или
Базовые функции Xpath - http://www.w3.org/TR/xpath/#corelib Name() # возвращает имя элемента
string(val) string(a/@id) # получить значение атрибута
substring(val, from, to) substring(@id, 1, 6) # вырезать часть строки
substring-after(val, from) substring-after(@id, "FROM")
substring-before
string-length() # возвращает число символов в строке
count() # возвращает количество элементов
concat()
normalize-space() # аналог trim, удаляет пробелы Пример:
starts-with()
contains()
translate("bar","abc","ABC") # BAr
Для выбора узлов и наборов узлов в XML документе XPath использует выражения путей. Узел выбирается следуя по заданному пути или по, так называемым, шагам. Для демонстрации синтаксиса XPath будет использоваться следующий XML документ:
Чтобы выбрать узлы в XML документе, XPath использует выражения пути. Узел выбирается следуя по заданному пути. Наиболее полезные выражения пути: В следующей таблице приводятся некоторые выражения XPath, позволяющие сделать некоторые выборки по демонстрационному XML документу: Предикаты позволяют найти конкретный узел или узел с конкретным значением. Предикаты всегда заключаются в квадратные скобки. В следующей таблице приводятся некоторые выражения XPath с предикатами, позволяющие сделать выборки по демонстрационному XML документу: Чтобы найти неизвестные заранее узлы XML документа, XPath позволяет использовать специальные символы. В следующей таблице приводятся некоторые выражения XPath со спецсимволами, позволяющие сделать выборки по демонстрационному XML документу: Использование оператора | в выражении XPath позволяет делать выбор по нескольким путям. В следующей таблице приводятся некоторые выражения XPath, позволяющие сделать выборки по демонстрационному XML документу. Взгляните на листинг 7.3, в котором при помощи оси Вот результат применения этой таблицы стилей к В листинге 7.4 добавлены атрибуты Предположим теперь, что я хочу перечислить по имени всех предков элементов Вот результат; показаны выбранные предки всех трех элементов В следующем примере (листинг 7.6) демонстрируется работа с этой осью. На этот раз я хочу добавить примечание к элементу Вот результирующий документ, дополненный новым элементом В следующем примере (листинг 7.7) демонстрируется работа с осью. В этом случае я создал упрощенную таблицу стилей (подробнее об упрощенных таблицах стилей см. главу 2), которая обрабатывает все элементы с использованием потомков, генерируя уже знакомую нам HTML-таблицу данных о планетах. Вот и все. Я применил здесь упрощенную таблицу стилей, чтобы подчеркнуть, что при помощи таких осей потомков, как Ось following (следующий) содержит все узлы, расположенные после контекстного узла в соответствии с установленным в документе порядком (другими словами, в порядке, в котором они появляются в документе, начиная с его начала), исключая всех потомков контекстного узла, а также исключая узлы атрибутов и пространств имен. В этом примере (листинг 7.8) я выбираю каждый элемент С другой стороны, при использовании оси Например, я могу выбрать каждый элемент При этом сначала копируются два узла-брата, следующие за Меркурием (Венера и Земля), затем копируется следующий узел-брат Венеры, Земля. У самой Земли нет следующих за ней братьев, поэтому результат выглядит так: Каждого атрибута элемента, чье имя начинается с «xmlns:»; Каждого атрибута элемента-предка, чье имя начинается с «xmlns:» (конечно, если сам элемент или ближайший предок не объявит пространство имен заново); Атрибута В следующем примере (листинг 7.10) я хочу отобразить пространство имен элемента Вот таблица стилей (листинг 7.11), в которой я проверяю пространства имен, используемые в элементе А вот результирующий документ (заметьте, что вид документа может меняться в зависимости от процессора XSLT): Ось parent (родитель) содержит родителя (и только родителя) контекстного узла, если таковой имеется. Предположим, что я хочу изменить содержимое элемента Земли И вот результат: Пусть, например, мне нужно задать для содержимого элемента Если текущая планета расположена после Меркурия, я могу вставить сообщение в ее элемент Что, если, например, вам нужно создать шаблон, который будет выбирать только элементы А вот результат: Эту ось полезно иметь в виду, поскольку, как вы помните из главы 4, если не задать ось, осью по умолчанию будет В следующем примере я объединяю шаблоны для элементов На этом мы завершаем рассмотрение новых осей XPath. Давайте перейдем к примерам. Мы изучили достаточно теории путей расположения. Но, понятно, лучше всего осваивать этот материал на примерах, поэтому я привожу следующий список примеров путей расположения (сокращенные варианты рассматриваются после этого списка): Как видите, синтаксис некоторых выражений достаточно запутан, и набирать их также довольно долго. Но, как и для образцов, существует сокращенная форма синтаксиса XPath. В пакет Xalan входит удобная программа-пример, ApplyXPath.java, позволяющая применить выражение XPath к документу и посмотреть на результат, что очень помогает при тестировании. Для запуска этого примера вам нужно будет скомпилировать В качестве примера я применю выражение XPath « 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; Должен поддерживать явное сравнение « Должен расширять множество функций агрегации (например, пользователи XSLT часто требовали добавить функции Должен сохранять обратную совместимость с XPath 1.0; Должен предоставлять функции пересечения и разности то есть - XPath 1.0 поддерживает объединение двух наборов узлов, и к этому должны быть добавлены функции пересечения и разности; Должен поддерживать операцию унарного плюса (поскольку в схеме XML у десятичных чисел может присутствовать лидирующий плюс); Должен улучшать удобство использования; Должен снизить ограничения на шаги расположения; Должен реализовывать условную операцию, оперирующую тремя выражениями - выражением 1 (логическая операция), выражением 2 и выражением 3. Если выражение 1 принимает значение «истина», должно вычисляться выражение 2, а если выражение 1 принимает значение «ложь», должно вычисляться выражение 3; Должен определять последовательный синтаксис для подвыражений, обрабатывающих коллекции элементов; Должен поддерживать дополнительные строковые функции. Например, W3C рассматривает вопрос добавления средств для замены в строках, заполнения символами и преобразований регистра; Должен поддерживать функции агрегации при применении к коллекциям. Например, некоторым пользователям XPath 1.0 требовалось применить такую функцию агрегации, как Должен поддерживать регулярные выражения для поиска в строках с использованием нотации регулярных выражений, установленной в схеме XML; Должен поддерживать элементарные типы данных схемы XML. То есть в дополнение к типам, поддерживаемым моделью данных XPath 1.0, - строке, числу, логическому значению и набору узлов - модель данных XPath 2.0 должна поддерживать элементарные типы данных схемы XML; Должен поддерживать представления чисел с плавающей точкой одинарной и двойной точности, поддерживаемые схемой XML, которая использует научную нотацию; Должен определять подходящий набор функций для работы пользователя с элементарными типами данных схемы XML; Должен добавлять в XPath тип данных «список» (поскольку схема XML позволяет определять простые типы, унаследованные от списка); Должен поддерживать доступ к значениям простых типов элементов и атрибутов. Поскольку схемы XML представляют много новых типов, XPath 2.0 должен поддерживать доступ к собственному, простого типа, значению элемента или атрибута; Должен определять поведение операторов для нулевых аргументов; Должен иметь средства для выбора элементов или атрибутов на основе явного типа схемы XML; Должен иметь средства для выбора элементов или атрибутов на основе иерархии типов схемы XML; Должен иметь средства для выбора элементов на основе групп подстановки схемы XML; Должен поддерживать средства поиска, основанные на уникальных ограничениях и ключах схемы. Хотя мы подошли к концу главы, о XPath сказано еще не все. Тема будет продолжена в следующей главе, в которой мы более внимательно рассмотрим доступные в XPath функции и функции, уже встроенные в XSLT.Использование Xpath в Firebug
Примеры
//div
//a
//*/ancestor-or-self::button
Базовый синтаксис
Пути
. # текущий контекст.// # рекурсивный спуск (на ноль или более уровней от текущего контекста)
/html/body # абсолютный путь
table//a # относительный путь
a # путь относительно текущего контекста
//* # все в текущем контексте
li/*/a # ссылки, являющиеся "внуками" для li
//a|//button # ссылки и кнопки (объединение двух множеств узлов)
Отношения
a/i/parent::p # непосредственный родитель, Получение узлов
/div/text() # получить текстовые узлы
/div/text() # получить первый текстовый узел
Позиция элемента
a # первый элемент
a # последний элемент
a[i] # вторая ссылка, которая содержит элемент
a # Первые 3 ссылки
ul # список (UL), первый элемент которого содержит значение "OK"
tr # не четные элементы
tr # четные элементы
p/text() # второй текстовый узел
Атрибуты и фильтры
Функции
Математика
//p[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]
//tr
position() #
div # деление
mod # остаток от деления
ceiling() # минимальное целое
floor() # максимальное целое
round()
sum()
Группирование
(table/tbody/tr) # последняя строка из всех таблиц
(//h1|//h2) # заголовок первого или второго уровня, который содержит "Text"
Составные условия фильтрации
Пример XML документа
Выбор узлов
Выражение XPath
Результат
messages
Выбирает все узлы с именем "messages"
/messages
Выбирает корневой элемент сообщений
Примечание
: Если путь начинается с косой черты (/), то он всегда представляет абсолютный путь к элементу!
messages/note
Выбирает все элементы note, являющиеся потомками элемента messages
//note
Выбирает все элементы note независимо от того, где в документе они находятся
messages//note
Выбирает все элементы note, являющиеся потомками элемента messages независимо от того, где они находятся от элемента messages
//@date
Выбирает все атрибуты с именем date
Предикаты
Выражение XPath
Результат
/messages/note
Выбирает первый элемент note, который является прямым потомком элемента messages.
Примечание
: В IE 5,6,7,8,9 первым узлом будет , однако согласно W3C это должен быть . Чтобы решить эту проблему в IE, нужно установить опцию SelectionLanguage в значение XPath.
В JavaScript: xml.setProperty("SelectionLanguage","XPath");
/messages/note
Выбирает последний элемент note, который является прямым потомком элемента messages.
/messages/note
Выбирает предпоследний элемент note, который является прямым потомком элемента messages.
/messages/note
Выбирает все элементы heading, у которых есть атрибут date
//heading[@date="10/01/2008"]
Выбирает все элементы heading, у которых есть атрибут date со значением "10/01/2008"
Выбор неизвестных заранее узлов
Выбор нескольких путей
(предок) содержит всех предков контекстного узла, включая родителей, дедушек, прадедушек и т.д. Эта ось всегда содержит корневой узел - если только контекстным узлом не является сам корневой узел. xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Применение оси ancestor-or-self
содержит всех предков контекстного узла, а также сам контекстный узел. Это означает, помимо прочего, что такая ось всегда содержит корневой узел.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Применение оси descendant
(потомок) содержит всех потомков контекстного узла. Заметьте, что сюда не входят атрибуты или узлы пространств имен, поскольку они не считаются дочерними узлами.
(Извините, но Меркурий взорвался и больше не доступен.). Чтобы найти Меркурий, мне достаточно только проверить, имеет ли какой-либо потомок элемента строковое значение «», что я сделаю при помощи выражения XPath внутри предиката выбора. Листинг 7.6. Применение оси descendant
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Применение оси descendant-or-self
содержит всех потомков контекстного узла и сам контекстный узел. Заметьте, однако, что она не содержит атрибутов и узлов пространств имен.
Применение оси following
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Меркурия, он копирует все последующие элементы - то есть Венеру, затем всех потомков Венеры, далее Землю и затем всех потомков Земли. После этого он выбирает элемент Венеры и копирует все следующие элементы, то есть Землю и всех потомков Земли:
Применение оси following-sibling
содержит всех последующих братьев контекстного узла. xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Применение оси namespace
содержит узлы пространств имен контекстного узла. Заметьте, что эта ось пуста, если контекстным узлом не является элемент. У элемента присутствует узел пространства имен для:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Применение оси parent
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Применение оси preceding
содержит все узлы, расположенные перед контекстным узлом в соответствии с установленным в документе порядком, исключая всех предков контекстного узла, а также исключая узлы атрибутов и узлы пространств имен. xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Применение оси preceding-sibling
содержит всех предшествующих братьев контекстного узла. Заметьте, что если контекстным узлом является узел атрибута или узел пространства имен, ось будет пуста. xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Применение оси self
содержит только контекстный узел. В соответствии с одним из сокращений XPath, как мы увидим дальше, вместо «» можно использовать «.».
Примеры путей расположения
child::PLANET/descendant::NAME
. Возвращает элементы-потомки дочерних элементов контекстного узла; . Возвращает всех внуков контекстного узла; . Возвращает корневой узел; . Возвращает все элементы в документе; /descendant::PLANET/child::NAME
. Возвращает все элементы с родителем в документе; . Возвращает третьего ребенка контекстного узла; child::PLANET
. Возвращает последнего ребенка контекстного узла; /descendant::PLANET
. Возвращает третий элемент в документе; child::PLANETS/child::PLANET/child::NAME
. Возвращает третий элемент четвертого элемента элемента ; . Возвращает всех детей контекстного узла после первых трех; preceding-sibling::NAME
. Возвращает второй предыдущий элемент-брат контекстного узла; child::*
. Возвращает детей и контекстного узла. child::*
. Возвращает последнего ребенка или контекстного узла. //PLANET
" выбирает все элементы , значение которых отлично от значения любого предшествующего элемента ; выбирает любой элемент , который является первым ребенком своего родителя; выбирает первых пятерых детей контекстного узла, у которых есть атрибут . Проверка выражений XPath
%java ApplyXPath planets.xml PLANET/NAME
XPath 2.0
Бесплатные программы для снятия скриншотов
Мобильное приложение сбербанк онлайн
Что такое трафик и как его посчитать?
Как найти файл на компьютере с windows Как сделать поиск в папке виндовс
Как посмотреть лайкнутые фотографии и записи вконтакте