XPath, або XML Path Language — це мова запитів, для вибору вузлів з XML документів, або для обчислення величин (наприклад, рядкових, числових або булевих) на основі вмісту XML документа. XPath був розроблений World Wide Web Consortium (W3C).

Огляд Мова XPath основана на представленні XML документа у вигляді дерева, і надає можливість навігації по дереву, та вибору його вузлів за різними критеріями. Популярно (проте не в офіційній специфікації) XPath-вирази називають просто «XPath».

На початку покликаний надати загальний синтаксис і модель поведінки між XPointer та XSLT, XPath швидко здобув визнання розробників як мова малих запитів, і його підмножини використовуються в інших W3C специфікаціях. Це, наприклад, XML Schema, XForms і .

Версії На сьогоднішній день є три версії мови XPath. Остання — версія 3.0 (10.04.2014), але XPath 1.0 все ще є найбільш вживаною.

XPath 1.0 стала рекомендацією 16 листопада 1999 року і широко впроваджена і використовується сама по собі (на зразок таких мов, як Java, C#, Python, JavaScript) або ж входить до інших мов (наприклад, XSLT, XProc, XML Schema, XForms). XPath 2.0 стала рекомендацією 23 січня 2007 року, була впроваджена значною мірою, але все ж не настільки широко використовувалася, як XPath 1.0. Специфікація цієї версії набагато більша ніж в XPath 1.0, змінено деякі фундаментальні концепції мови, як наприклад, система типізації. Найбільш помітною зміною є те, що XPath 2.0 побудована на основі , що має значно багатшу систему типізації.XPath 2.0 підтримує атомні типи, визначені в XML Schema як вбудовані, і також може імпортувати типи зі схеми, визначені користувачем. Кожне значення тепер є послідовністю (одне атомарне значення або вузол розглядаються як послідовність одиничної довжини). Множини вузлів, характерні для XPath 1.0, замінено послідовностями вузлів, що можуть бути в будь-якому порядку. Щоб підтримати більші набори типів, XPath 2.0 пропонує неймовірно поширену сукупність функції та операторів. XPath 2.0 є насправді підмножиною XQuery 1.0. Вони використовують однакову модель даних (XDM). Це дозволяє виразу for, що є урізаною версією «FLWOR» виразів в XQuery. Можливо описати мову, перераховуючи частини XQuery, що не включає: головні приклади, які є прологами запиту, елемент та атрибут конструкторів, іншу частину «FLWOR» синтаксису, і вираз typeswitch. XPath 3.0 стала рекомендацією 8 квітня 2014 року. Найбільш значним нововведенням є підтримка функцій як значень першого класу. Щоб дізнатись більше про XPath 3.0, дивисьWhat's new in 3.0 (XSLT/XPath/XQuery) (plus XML Schema 1.1) by Michael Kay, Saxonica. XPath 3.0 є підмножиною XQuery 3.0, а також найсучаснішою реалізацією, що існує, як частина рушія XQuery станом на квітень 2014 року.

Синтаксис і семантика (XPath 1.0)

Найбільш важливий тип виразу в XPath є шлях до файлу. Шлях до файлу складається з послідовності каталогів. Кожен каталог містить три компоненти:

вісь визначення вузла предикати (може бути декілька, або не бути взагалі).

Вираз XPath обчислюється по відношенню до контекстного вузла. Осі, такий як 'child' або 'descendant', описують шлях для навігації від контекстного вузла. Визначення вузла і предикати використовуються для фільтрування вузлів, означених віссю. Наприклад, визначення вузла 'A' вимагають від інших напрямлених вузлів мати позначку 'A'. Предикат може використовуватися з метою зазначити, що вибрані вузли мають певні властивості (самовизначені XPath виразами).

Синтаксис XPath поставляється в двох варіантах: скорочений синтаксис (що є більш компактним і дозволяє XPath виразам бути легко написаними і прочитаними, використовуючи інтуїтивні і в багатьох випадках звичні характеристики і конструктори. Розширений синтаксис є менш компактний, але дозволяє описати більше опцій, є більш наочний.

Скорочений синтаксис Компактне позначення дозволяє багато за замовчуванням і скорочень для загальних випадків. Для даного XML документу

<A> <B> <C/> </B> </A>

найпростіший XPath вираз /A/B/C обирає ті елементи C, що є дітьми B, що в свою чергу є дітьми A, що є найбільш віддаленим елементом (в даному разі коренем) цього XML документу. Синтаксис XPath є розроблений, щоб імітувати URI і синтаксис шляху до файлу.

Більш складні вирази можуть бути сконструйовані вибором осі, відмінної від 'child' ('child' — вісь за замовчуванням), даних вузла (не просто імені) чи предикатів, що можуть бути записані в квадратних дужках на кожному кроці. Наприклад, вираз A//B/* вибирає першу дитину ('*'), не зважаючи на ім'я, кожного елемента B, що в свою чергу є або дитиною, або більш дальнім нащадком ('//') елемента A, що є дитиною поточного контекстного вузла (вираз не починається з '/'). Зверніть увагу, що предикат пов'язує більш щільно, ніж оператор /. Щоб вибрати перший вузол, вибраний виразом A//B/*, напишіть (A//B/*). Зверніть також увагу на те, що значення індексу в предикатах XPath (технічно, «позиції» близькість від XPath наборів вузлів) починається з 1, а не з 0, як прийнято в таких мовах, як C і Java.

Розширений синтаксис У повному нескороченому синтаксисі два вищеописаних приклади буде записано /child::A/child::B/child::C child::A/descendant-or-self::node()/child::B/child::*[position()=1]

Тут на кожному кроці вісь(наприклад, child or descendant-or-self) вказується явно, потім пишуть :: і потім визначення вузла, так як A або node() в розглянутих прикладах.

Осі Осі вказують на напрям навігації по дереві XML документа. Є такі осі:

Розширений синтаксис Скорочений синтаксис Поясненняancestor Вибирає всіх предків (батька, прабатька і т. д.) поточного вузлаancestor-or-self Вибирає всіх предків (батька, прабатька і т. д.) поточного вузла і його самогоattribute@Вибирає всі атрибути поточного вузлаchild Вибирає всіх дітей поточного вузлаdescendant Вибирає всіх нащадків (дітей, внуків і т. д.) поточного вузлаdescendant-or-self//Вибирає всіх нащадків (дітей, внуків і т. д.) поточного вузла і його самогоfollowing Вибирає все в документі після закриваючого тегу поточного вузлаfollowing-sibling Вибирає всіх «братів» після поточного вузлаnamespace Вибирає всі вузли простору імен поточного вузлаparent..Вибирає всіх батьків поточного вузлаpreceding Вибирає всі вузли, що з'являлись перед поточним вузлом у документі, крім предків, вузлів з атрибутами і вузлів простору іменpreceding-sibling Вибирає всіх «братів» перед поточним вузломself.Вибирає поточний вузол

Розглянемо приклад використання осі following-sibling на наступному XML документі:

<items> <item>1</item> <item>2</item> <item>3</item> <item>4</item> </items>

XPath вираз items/item/following-sibling::item[position()='2'] поверне '34' — значення третього і четвертого вузлів <item>, тобто тих, що йдуть після <item> на другій позиції.

Для демонстрації роботи descendant використаємо наступний XML документ:

<items> <item> <page>page1</page> <page>page2</page> <page>page3</page> </item> <item>2</item> <item>3</item> <item>4</item> </items>

Написавши наступне descendant::items/item[position()='1'] отримаємо 'page1 page2 page3', тобто значення всіх нащадків <item>, що стоїть на першій позиції.

Як приклад використання осі attribute в скороченому синтаксисі, //a/@href вибирає атрибути з назвою href в усіх a елементах, що зустрічаються в документі. Вираз . (скорочений запис від self::node()) найчастіше використовується в предикаті, щоб звернутись до поточного вузла. Наприклад, h3[.='See also'] вибирає елемент в поточному контексті з назвою h3 із значенням See also.

Визначення вузла Визначення вузла може складатися з конкретних імен вузлів або більш загальних виразів. У разі, якщо в XML документі був визначений префікс простору імен gs, //gs:enquiry знайде всі enquiry елементи в цьому просторі імен, і //gs:* знайде всі елементи, незалежно від локальної назви, в цьому просторі імен.

Іншими форматами визначення вузла є: comment() знаходить XML вузол з коментарем (наприклад, <!-- Comment -->) text() знаходить вузол з відповідним текстом (наприклад, hello world в hello world) processing-instruction() знаходить інструкції з обробки XML документа, такі як <?php echo $a; ?>. В цьому випадку processing-instruction('php') збігатимуться. node() знаходить будь-який вузол загалом

Предикати Предикати, записані у вигляді виразів у квадратних дужках, можуть бути використані для обмеження набору вузлів, для вибору тільки тих вузлів, для яких виконується деяка умова. Наприклад, a[@href='help.php'] вибере ті a елементи (з-поміж дітей контекстного вузла), що містять атрибут href із значенням help.php.

Нема обмеження на кількість предикатів, застосованих на одному кроці, і вони не повинні бути обмежені до останнього кроку в XPath виразі. Також вони можуть бути вкладені на будь-яку глибину. Шлях, визначений предикатами, починається в контексті поточного кроку і не змінює цей контекст. Всі умови повинні виконатися, щоб відбулась дія.

Коли значенням предиката є цифра, вона інтерпретується як тест на позицію (номер) вузла. Таким чином p вибирає перший p елемент-дитину, в той час, як p[last()] вибирає останню.

В іншим випадках значення предиката є автоматично конвертовані до булевих. Коли предикат оцінює множину вузлів, результат є true коли множина вузлів не є порожньою. Отже, p[@x] вибирає ті p елементи, котрі мають атрибут x.

Більш складний приклад: a[/html/@lang='en'][@href='help.php']/@target вибирає значення атрибута target першого a елемента з-поміж дітей контекстного вузла, що має свій власний атрибут href із значенням help.php, за умови, що елемент верхнього рівня html також має атрибут lang із значенням en. Посилання на атрибут елемента верхнього рівня в першому предикаті не впливає ні на контекст інших предикатів, ні на місцезнаходження його самого на даному кроці.

Порядок предикатів є важливий, якщо предикати перевіряються позицію вузла. Кожен предикат «фільтрує» місцезнаходження вибраного набору вузлів на даному кроці по черзі. Отже, a[@href='help.php'] знайде відповідність, лише якщо перша a дитина контекстного вузла відповідає умові @href='help.php', в той час, як a[@href='help.php'] знайде першу a дитину, що задовільняє умові.

Функції та оператори

XPath 1.0 визначає чотири типи даних: множини вузлів, рядки, числа, логічні типи.

Доступними є наступні оператори: «/», «//» і «[…]» оператори, що використовуються у XPath виразах, як це було описано раніше оператор об'єднання "|", що об'єднує дві множини вузлів булеві оператори «and» і «or», і функція «not()» арифметичні оператори «+», «-», «*», «div» (ділення), і «mod» (ділення за модулем) Оператори порівняння «=», «!=», «<», «>», «<=», «>=»

Бібліотека включає стандартні функції (більше 100): для маніпулювання рядками: concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length() для маніпулювання числами: sum(), round(), floor(), ceiling() для отримання властивостей вузлів: name(), local-name(), namespace-uri() для отримання інформації про контекст обробки: position(), last() для конвертування: string(), number(), boolean()

Системні функції 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) Параметри, що повертають системні змінні, можуть бути: