- XPath
-
Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей.XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML. В XPath используется компактный синтаксис, отличный от принятого в XML. В 2007 году завершилась разработка версии 2.0, которая теперь является составной частью языка XQuery 1.0. В декабре 2009 года началась разработка версии 2.1, которая использует XQuery 1.1.
На данный момент, самой популярной версией является XPath 1.0. Это связано с отсутствием поддержки XPath 2.0 со стороны открытых библиотек. В частности, речь идёт о LibXML, от которой зависит поддержка языка в браузерах с одной стороны и поддержка со стороны серверного интерпретатора с другой.
Содержание
Основы
XML имеет древовидную структуру. В документе всегда имеется корневой элемент (инструкция <?xml version="1.0"?> к дереву отношения не имеет). У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков. Каждый элемент дерева находится на определенном уровне вложенности (далее — «уровень»). У элементов на одном уровне бывают предыдущие и следующие элементы.
Это очень похоже на организацию каталогов в файловой системе, и строки XPath, фактически, — пути к «файлам» — элементам.
Например, рассмотрим XHTML документ:
<html> <body> <div>Первый слой <span>блок текста в первом слое</span> </div> <div>Второй слой</div> <div>Третий слой <span class="text">первый блок в третьем слое</span> <span class="text">второй блок в третьем слое</span> <span>третий блок в третьем слое</span> </div> <img /> </body> </html>
XPath-путь /html/body/*/span[@class] (полный синтаксис имеет вид /child::html/child::body/child::*/child::span[attribute::class]) будет соответствовать в нём двум элементам исходного документа —
<span class="text">первый блок в третьем слое</span>
и<span class="text">второй блок в третьем слое</span>
.Путь делится на шаги адресации, которые разделяются символом «косая черта»
/
. Каждый шаг адресации состоит из трех частей:- ось (в данном примере child::), это обязательная часть;
- условие проверки узлов (в данном примере это имена элементов документа html, body, span, а символ * означает элемент с любым именем), также обязательная часть;
- предикат (в данном примере attribute::class), необязательная часть, заключаемая в квадратные скобки, в которой могут содержаться оси, условия проверки, функции, операторы (+, -, <, > и пр.).
Анализ ведется слева направо. Если первый символ это
/
, то путь адресации считается абсолютным (то есть от корня документа). При этом за узел контекста на первом шаге берется корневой элемент (html). Контекст — это некая точка отсчета, относительно которой рассчитывается следующий шаг адресации. Поэтому на каждом шаге адресации мы получаем новый набор узлов документа, и этот набор становится контекстом для следующего шага адресации.На втором шаге адресации (child::body) контекстом становится html элемент. Ось child:: говорит о том, что необходимо найти все непосредственные потомки элемента html, а условие проверки body говорит о том, что в формируемый набор элементов нужно включить все узлы с именем body. В ходе второго шага адресации получаем набор узлов, состоящий всего из одного элемента body, который и становится элементом контекста для третьего шага.
Третий шаг адресации: child::* . Ось child:: собирает все непосредственные потомки элемента body, а условие проверки * говорит о том, что в формируемый набор нужно включить элементы основного типа с любым именем. В ходе этого шага получаем набор узлов, состоящий из трех элементов div и одного элемента img.
Четвёртый шаг адресации: child::span . Теперь контекстом является набор из четырёх элементов. И следующий набор узлов создается в четыре прохода (за четыре итерации). При первой итерации узлом контекста становится первый div. Согласно заданной оси child:: и правилу проверки span, в набор включаются непосредственные потомки div-а, имя которых равно span. При второй итерации в набор ничего добавлено не будет, так как у второго div нет потомков. Третья итерация добавит в набор сразу три элемента span, а четвёртая ничего не добавит, так как у элемента img нет потомков. Итак, в ходе проверки получен набор узлов, состоящий из четырёх элементов span. Это и будет контекстом для последующей обработки.
Следующего шага нет, поэтому будет производиться фильтрация отобранного набора. В этом и состоит отличие предикатов от шагов адресации. На каждом шаге адресации получаем новый набор, отталкиваясь от контекста, полученного на предыдущем шаге. В ходе же обработки предиката новый набор получается из текущего методом фильтрации, когда из набора исключаются узлы, не прошедшие условие проверки. В данном случае ось attribute:: говорит о необходимости проверить, если ли у узлов контекста атрибуты, а условие class требует оставить лишь те узлы, у которых задан атрибут с именем class. Фильтрация происходит за четыре итерации, но в окончательный набор попадают только два элемента span.
Оси
Оси — это база языка XPath.
- ancestor:: — Возвращает множество предков.
- ancestor-or-self:: — Возвращает множество предков и текущий элемент.
- attribute:: — Возвращает множество атрибутов текущего элемента.
- child:: — Возвращает множество потомков на один уровень ниже.
- descendant:: — Возвращает полное множество потомков.
- descendant-or-self:: — Возвращает полное множество потомков и текущий элемент.
- following:: — Возвращает необработанное множество, ниже текущего элемента.
- following-sibling:: — Возвращает множество элементов на том же уровне, следующих за текущим.
- namespace:: — Возвращает множество, имеющее пространство имён (то есть присутствует атрибут xmlns).
- parent:: — Возвращает предка на один уровень назад.
- preceding:: — Возвращает множество обработанных элементов исключая множество предков.
- preceding-sibling:: — Возвращает множество элементов на том же уровне, предшествующих текущему.
- self:: — Возвращает текущий элемент.
Существуют сокращения для некоторых осей, например:
- attribute:: — можно заменить на «@»
- child:: — часто просто опускают
- descendant:: — можно заменить на «.//»
- parent:: — можно заменить на «..»
- self:: — можно заменить на «.»
Дополнением к базе является набор функций, которые делятся на 5 групп:
Системные функции
- node-set document(object, node-set?)
- Возвращает документ, указанный в параметре object.
- string format-number(number, string, string?)
- Форматирует число согласно образцу, указанному во втором параметре, третий параметр указывает именованный формат числа, который должен быть учтён.
- string generate-id(node-set?)
- Возвращает строку, являющуюся уникальным идентификатором.
- node-set key(string, object)
- Возвращает множество с указанным ключом (аналогично функции id для идентификаторов).
- string unparsed-entity-uri(string)
- Возвращает непроанализированный URI, если такового нет, возвращает пустую строку.
- boolean element-available(string)
- Проверяет, доступен ли элемент или множество, указанное в параметре. Параметр рассматривается как XPath.
- boolean function-available(string)
- Проверяет, доступна ли функция, указанная в параметре. Параметр рассматривается как XPath.
- object system-property(string)
- Параметры, возвращающие системные переменные, могут быть:
- * xsl: version — возвращает версию XSLT процессора.
- * xsl: vendor — возвращает производителя XSLT процессора.
- * xsl: vendor-url — возвращает URL, идентифицирующий производителя.
- Если используется неизвестный параметр, функция возвращает пустую строку.
- boolean lang(string)
- Возвращает истину, если у текущего тега имеется атрибут xml: lang, либо родитель тега имеет атрибут xml: lang и в нем указан совпадающий строке символ.
Функции с множествами
- * — обозначает любое имя или набор символов, @* — любой атрибут
- $name — обращение к переменной, где name — имя переменной или параметра.
- [] — дополнительные условия выборки
- {} — если применяется внутри тега другого языка (например HTML), то XSLT процессор рассматривает содержимое фигурных скобок как XPath.
- / — определяет уровень дерева
- node-set node()
- Возвращает все узлы. Для этой функции часто используют заменитель '*', но в отличие от звездочки — node() возвращает и текстовые узлы.
- string text()
- Возвращает набор текстовых узлов;
- node-set current()
- Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с условиями, то единственным способом дотянуться из этого условия до текущего элемента будет данная функция.
- number position()
- Возвращает позицию элемента в множестве. Корректно работает только в цикле <xsl:for-each/>
- number last()
- Возвращает номер последнего элемента в множестве. Корректно работает только в цикле <xsl:for-each/>
- number count(node-set)
- Возвращает количество элементов в node-set.
- string name(node-set?)
- Возвращает полное имя первого тега в множестве.
- string namespace-uri(node-set?)
- Возвращает ссылку на url определяющий пространство имён.
- string local-name(node-set?)
- Возвращает имя первого тега в множестве, без пространства имён.
- node-set id(object)
- Находит элемент с уникальным идентификатором
Строковые функции
- string string(object?)
- Возвращает текстовое содержимое элемента. По сути возвращает объединенное множество текстовых элементов на один уровень ниже.
- string concat(string, string, string*)
- Объединяет две или более строк
- number string-length(string?)
- Возвращает длину строки.
- boolean contains(string, string)
- Возвращает истину, если первая строка содержит вторую, иначе возвращает ложь.
- string substring(string, number, number?)
- Возвращает строку вырезанную из строки начиная с указанного номера, и если указан второй номер — количество символов.
- string substring-before(string, string)
- Если найдена вторая строка в первой, возвращает строку до первого вхождения второй строки.
- string substring-after(string, string)
- Если найдена вторая строка в первой, возвращает строку после первого вхождения второй строки.
- boolean starts-with(string, string)
- Возвращает истину если вторая строка входит в начало первой, иначе возвращает ложь.
- boolean ends-with(string, string)
- Возвращает истину если вторая строка входит в конец первой, иначе возвращает ложь.
- string normalize-space(string?)
- Убирает лишние и повторные пробелы, а также управляющие символы, заменяя их пробелами.
- string translate(string, string, string)
- Заменяет символы первой строки, которые встречаются во второй строке, на соответствующие позиции символам из второй строки символы из третьей строки. translate(«bar», «abc», «ABC») вернет BAr.
Логические функции
- or — логическое «или»
- and — логическое «и»
- = — логическое «равно»
- < (<) — логическое «меньше»
- > (>) — логическое «больше»
- <= (<=) — логическое «меньше либо равно»
- >= (>=) — логическое «больше либо равно»
- boolean boolean(object)
- Приводит объект к логическому типу;
- boolean true()
- Возвращает истину.
- boolean false()
- Возвращает ложь.
- boolean not(boolean)
- Отрицание, возвращает истину если аргумент ложь и наоборот.
Числовые функции
- + — сложение
- − — вычитание
- * — умножение
- div — обычное деление (не деление нацело!)
- mod — остаток от деления
- number number(object?)
- Переводит объект в число.
- number sum(node-set)
- Вернёт сумму множества, каждый тег множества будет преобразован в строку и из него получено число.
- number floor(number)
- Возвращает наибольшее целое число, не большее, чем аргумент.
- number ceiling(number)
- Возвращает наименьшее целое число, не меньшее, чем аргумент.
- number round(number)
- Округляет число по математическим правилам.
Ссылки
- XPath 1.0. Рекомендация W3C. (англ.)
- XPath 2.0. Рекомендация W3C. (англ.)
- XPath 2.1. Рекомендация W3C. (англ.)
- XPath 1.0. Перевод рекомендации W3C на русский язык.
- XPath в примерах
- XPath инъекции
- XPath в JavaScript
- XPath учебник (нем.)
Языки запросов .QL · CQL · CODASYL · COQL · D · DMX · Datalog · ERROL · ISBL · LDAP · MQL · MDX · OQL · OCL · Poliqarp Query Language · QUEL · SMARTS · SPARQL · SQL · SuprTool · TMQL · XQuery · XPath · XSQL · YQL XSL XSLT (элементы) • XSL-FO • XPath 1.0, 2.0 Стандарты Консорциума Всемирной паутины Рекомендации Canonical XML • CDF • CSS • DOM • Geolocation API • HTML • ITS • MathML • OWL • P3P • PLS • RDF (Schema) • SISR • SKOS • SMIL • SOAP • SRGS • SSML • SVG • SPARQL • Timed Text • VoiceXML • WSDL • XForms • XHTML • XHTML+RDFa • XInclude • XLink • XML (Base • Encryption • Events • Information Set • namespace • Schema • Signature) • XPath / 1.0 / 2.0 • XPointer • XProc • XQuery • XSL • XSL-FO • XSLT (элементы) • XUP
Примечания XAdES • XHTML+SMIL
Рабочие проекты CCXML • CURIE • HTML5 • InkML • RIF • SCXML • SMIL Timesheets • sXBL • WICD • XFDL • XFrames • XBL • XHTML+MathML+SVG • XMLHttpRequest
Guidelines Web Content Accessibility Guidelines
Initiative Multimodal Interaction Activity • Markup Validation Service • Web Accessibility Initiative
Deprecated Организации World Wide Web Foundation • SVG Working Group • WebOnt • Device Description Working Group • WHATWG
ПО Agora • Argo • Arena • Amaya • CERN httpd • Libwww • Line Mode Browser
Конференции IW3C2 • World Wide Web Conference • WWWC1
Категории:- XML
- Стандарты W3C
Wikimedia Foundation. 2010.