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"?> к дереву отношения не имеет). У элементов дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет. Элементы дерева имеют уровни вложенности (далее — «уровни»). У элементов на одном уровне бывают предыдущие и следующие элементы.
<root> - корневой элемент
<node1> - предок - root, следующий на уровне - node2, имеет потомка node11
<node11/> - имеет предка node1
</node1>
<node2/> - предыдущий элемент - node1, следующий - node3, предок - root
<node3/>
</root>
Для нахождения элемента(ов) в дереве документа используются пути адресации. Например, рассмотрим XML документ:
<html>
<body>
<div>Первый слой
<span>блок текста в первом слое</span>
</div>
<div>Второй слой</div>
<div>Третий слой
<span class="text">первый блок в третьем слое</span>
<span class="text">второй блок в третьем слое</span>
<span>третий блок в третьем слое</span>
</div>
<img />
</body>
</html>
Рассмотрим также путь адресации /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-or-self:: — можно заменить на «//»
- parent:: — можно заменить на «..»
- self:: — можно заменить на «.»
Дополнением к базе является набор функций, которые делятся на 5 групп:
Системные функции
- node-set document(objec!, node-set?)
- Возвращает документ указанный в параметре objec!.
- string format-number(number, string, string?)
- Форматирует число согласно образцу указанному во втором параметре, третий параметр указывает именованный формат числа, который должен быть учтён.
- string generate-id(node-set?)
- Возвращает строку, являющуюся уникальным идентификатором.
- node-set key(string, objec!)
- Возвращает множество с указанным ключом, аналогично функции id для идентификаторов.
- string unparsed-entity-uri(string)
- Возвращает непроанализированный URI, если такового нет, возвращает пустую строку.
- boolean element-available(string)
- Проверяет доступен ли элемент или множество указанное в параметре. Параметр рассматривается как XPath.
- boolean function-available(string)
- Проверяет доступна ли функция указанная в параметре. Параметр рассматривается как XPath.
- objec! 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() возвращает и текстовые элементы.
- 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(objec!)
- Находит элемент с уникальным идентификатором
Строковые функции
- string text()
- Возвращает текстовое содержимое элемента. По сути возврашает объединенное множество текстовых элементов на один уровень ниже.
- 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
- Спецификация XPath 2.0
- Спецификация XPath 2.1
- перевод спецификации XML Path (XPath) версия 1.0
- XPath в примерах (рус.)
- XPath инъекции
- KB от Microsoft
- Проверка запросов XPath в .NET (рус.)
- XPath в JavaScript (рус.)
Стандарты Консорциума Всемирной паутины |
|
---|---|
Рекомендации | CDF • CGI • CSS • DOM • HTML • LOGML • MathML • OWL • RDF • RDF Schema • SISR • SMIL • SOAP • SRGS • SSML • SVG • Timed Text • VoiceXML • WSDL • XForms • XHTML • XInclude • XML • XML Base • XML Events • XML Information Set • XML Schema • XPath • XPointer • XQuery • XSL • XSL-FO • XSLT • XLink |
Примечания | XHTML+SMIL |
Рабочие проекты | CCXML • CURIE • InkML • XFrames • XFDL • WICD • XHTML+MathML+SVG |
См. также | WHATWG |
bs:XPath cs:XPath da:XPath de:XPath en:XPath es:XPath eu:XPath fi:XPath fr:XPath he:XSL#XPath is:XPath it:XPath ja:XML Path Language ko:XPath lt:XPath nl:XPath pl:XPath pt:XPath ro:XPath sv:XPath tr:XPath uk:XPath zh:XPath
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....