Xpath

Xpath

XPath (XML Path Language) - язык запросов к элементам XSLT, и является стандартом консорциума W3C.

В XPath используется компактный синтаксис, отличный от принятого в XML.

В 2007 году завершилась разработка версии 2.0, которая теперь является составной частью языка

Основы

XML имеет древовидную структуру. В документе всегда имеется корневой элемент (инструкция <?xml version="1.0"?> к дереву отношения не имеет). У элементов дерева всегда существуют потомки и предки, в отличие от корневого элемента, у которого предков нет. Элементы дерева имеют уровни вложенности (далее уровни). У элементов на одном уровне бывают предыдущие и следующие элементы.

<root>              - корневой элемент  
    <node1>         - предок - root, следующий на уровне - node2, имеет потомка node11  
        <node11/>   - имеет предка node1  
    </node1>     
    <node2/>        - предыдущий элемент - node1, следующий - node3, предок - root  
    <node3/>     
</root>     

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

Для нахождения элемента(ов) в дереве документа используются пути адресации. Например, рассмотрим 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 — логическое «и»
  • = — логическое «равно»
  • < (&lt;) — логическое «меньше»
  • > (&gt;) — логическое «больше»
  • <= (&lt;=) — логическое «меньше либо равно»
  • >= (&gt;=) — логическое «больше либо равно»
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)
Округляет число по математическим правилам.

Ссылки



Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Полезное


Смотреть что такое "Xpath" в других словарях:

  • XPath 1.0 — XPath (XML Path Language) is a language for selecting nodes from an XML document. In addition, XPath may be used to compute values (strings, numbers, or boolean values) from the content of an XML document. The current version of the language is… …   Wikipedia

  • XPath — est un langage (non XML) pour localiser une portion d un document XML. Initialement créé pour fournir une syntaxe et une sémantique aux fonctions communes à XPointer et XSL, XPath a rapidement été adopté par les développeurs comme langage d… …   Wikipédia en Français

  • XPath 2.0 — is the current version of the XPath language defined by the World Wide Web Consortium, W3C. It became a recommendation on 23 January 2007.XPath is used primarily for selecting parts of an XML document. For this purpose the XML document is… …   Wikipedia

  • XPath — (XML Path Language) es un lenguaje que permite construir expresiones que recorren y procesan un documento XML. La idea es parecida a las expresiones regulares para seleccionar partes de un texto sin atributos (plain text). XPath permite buscar y… …   Wikipedia Español

  • XPath — es un lenguaje (basado en XML) que permite seleccionar subconjuntos de un documento XML. La idea es parecida a las expresiones regulares para seleccionar partes de un texto sin atributos (plain text). XPath permite buscar y seleccionar teniendo… …   Enciclopedia Universal

  • XPath — Die XML Path Language (XPath) ist eine vom W3 Konsortium entwickelte Abfragesprache, um Teile eines XML Dokumentes zu adressieren. XPath dient als Grundlage einer Reihe weiterer Standards wie XSLT, XPointer und XQuery. Seit ihrer Verabschiedung… …   Deutsch Wikipedia

  • XPATH — Die XML Path Language (XPath) ist eine vom W3 Konsortium entwickelte Abfragesprache, um Teile eines XML Dokumentes zu adressieren. XPath dient als Grundlage einer Reihe weiterer Standards wie XSLT, XPointer und XQuery. Seit ihrer Verabschiedung… …   Deutsch Wikipedia

  • XPath — Infobox programming language name = XPath paradigm = query language year = 1999 designer = developer = W3C latest release version = 2.0 latest release date = January 23 2007 typing = implementations = JavaScript, C#, Java dialects = influenced by …   Wikipedia

  • XPath — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей. XPath (XML Path Language)  я …   Википедия

  • Xpath data model — XPath is a language for selecting portions of an XML Document (sequences of nodes of an XML tree). XPath uses a specific conceptual interpretation XML documents, referred to as the XPath Data Model. Technical documents on XML often uses the same… …   Wikipedia


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»