Синтаксис XPath. Мова запитів XPath

     (Предок) містить всіх предків контекстного вузла, включаючи батьків, дідусів, прадідусів і т.д. Ця вісь завжди містить кореневий вузол - якщо тільки контекстним вузлом не є сам кореневої вузол.

Погляньте на лістинг 7.3, в якому за допомогою осі

  здійснюється пошук імен (збережених в елементі) всіх предків елементів. Лістинг 7.3. Застосування осі ancestor
  xmlns: xsl = "http://www.w3.org/1999/XSL/Transform"\u003e

Ось результат застосування цієї таблиці стилів до

:

Застосування осі ancestor-or-self

  містить всіх предків контекстного вузла, а також сам контекстний вузол. Це означає, крім іншого, що така вісь завжди містить кореневий вузол.

У лістингу 7.4 додані атрибути

  зі значенням «Steve» в весь документ. Лістинг 7.4. planets.xml з атрибутами AUTHOR
.0553
58.65
1516
.983
43.4
.815
116.75
3716
.943
66.8
1
2107
1
128.4

Припустимо тепер, що я хочу перерахувати по імені всіх предків елементів

, Що мають атрибут, а також поточний елемент, якщо у нього є атрибут. Це можна зробити за допомогою осі і функції (лістинг 7.5). Лістинг 7.5. Застосування осі ancestor-or-self
  xmlns: xsl = "http://www.w3.org/1999/XSL/Transform"\u003e

Ось результат; показані вибрані предки всіх трьох елементів

, Включаючи сам елемент, за умови, що у нього є атрибут:

Застосування осі descendant

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

У наступному прикладі (лістинг 7.6) демонструється робота з цією віссю. На цей раз я хочу додати примітку до елементу

  Меркурія:
  (Вибачте, але Меркурій вибухнув і більше не доступний.). Щоб знайти Меркурій, мені достатньо лише перевірити, чи має будь-якої нащадок елемента строкове значення «», що я зроблю за допомогою виразу XPath всередині предиката вибору. Лістинг 7.6. Застосування осі descendant
  xmlns: xsl = "http://www.w3.org/1999/XSL/Transform"\u003e
Sorry. Mercury has blown up and is no longer available.

Ось результуючий документ, доповнений новим елементом

  тільки для Меркурія:
.0553
58.65
1516
.983
43.4
Sorry, Mercury has blown up and is no longer available.
.815
116.75
3716
.943
66.8

Застосування осі descendant-or-self

  містить всіх нащадків контекстного вузла і сам контекстний вузол. Зауважте, однак, що вона не містить атрибутів і вузлів просторів імен.

У наступному прикладі (лістинг 7.7) демонструється робота з віссю. В цьому випадку я створив спрощену таблицю стилів (докладніше про спрощені таблицях стилів див. Розділ 2), яка обробляє всі елементи з використанням нащадків, генеруючи вже знайому нам HTML-таблицю даних про планетах.

Лістинг 7.7. Застосування осі descendant-or-self

От і все. Я застосував тут спрощену таблицю стилів, щоб підкреслити, що за допомогою таких осей нащадків, як

  або, ви можете автоматично обробляти всі обрані вузли, багато в чому аналогічна тій, як це роблять елементи або.

Застосування осі following

Ось following (наступний) містить всі вузли, розташовані після контекстного вузла відповідно до встановленого в документі порядком (іншими словами, в порядку, в якому вони з'являються в документі, починаючи з його початку), виключаючи всіх нащадків контекстного вузла, а також виключаючи вузли атрибутів і просторів імен.

У цьому прикладі (лістинг 7.8) я вибираю кожен елемент І копіюю всі наступні елементи в результуючий документ.

Лістинг 7.8. Застосування осі following
  xmlns: xsl = "http://www.w3.org/1999/XSL/Transform"\u003e
   Меркурія, він копіює всі наступні елементи - тобто Венеру, потім всіх нащадків Венери, далі Землю і потім всіх нащадків Землі. Після цього він вибирає елемент Венери і копіює все наступні елементи, тобто Землю і всіх нащадків Землі:
.815
116.75
3716
.943
66.8
.815
116.75
3716
.943
66.8
1
2107
1
128.4
1
2107
1
128.4
1
2107
1
128.4
1
2107
1
128.4

З іншого боку, при використанні осі

  в результуючий документ будуть скопійовані тільки такі брати, тобто тільки елементи, як ми побачимо в наступному розділі.

Застосування осі following-sibling

  містить всіх наступних братів контекстного вузла.

Наприклад, я можу вибрати кожен елемент

  і скопіювати в результуючий документ все вузли в осі таким чином (лістинг 7.9). Лістинг 7.9. Застосування осі following-sibling
  xmlns: xsl = "http://www.w3.org/1999/XSL/Transform"\u003e

При цьому спочатку копіюються два вузла-брата, наступні за Меркурієм (Венера і Земля), потім копіюється наступний вузол-брат Венери, Земля. У самій Землі немає таких з ним братів, тому результат виглядає так:

.815
116.75
3716
.943
66.8
1
2107
1
128.4
1
2107
1
128.4

Застосування осі namespace

  містить вузли просторів імен контекстного вузла. Зауважте, що ця вісь порожня, якщо контекстним вузлом не є елемент. У елемента присутній вузол простору імен для:

Кожного атрибута елемента, чиє ім'я починається з «xmlns:»;

Кожного атрибута елемента-предка, чиє ім'я починається з «xmlns:» (звичайно, якщо сам елемент або найближчий предок не оголосить простір імен заново);

атрибуту

, Якщо елемент або предок має атрибут.

У наступному прикладі (лістинг 7.10) я хочу відобразити простір імен елемента

  в результуючому документі, і в вихідному документі я присвоїв простору імен значення «http://www.starpowder.com». Лістинг 7.10. planets.xml з оголошенням простору імен
.0553
58.65
1516
.983
43.4

Ось таблиця стилів (лістинг 7.11), в якій я перевіряю простору імен, що використовуються в елементі

. Лістинг 7.11. Застосування осі namespace в planets.xml
  xmlns: xsl = "http://www.w3.org/1999/XSL/Transform"\u003e

А ось результуючий документ (зауважте, що вид документа може змінюватися в залежності від процесора XSLT):

Застосування осі parent

Ось parent (батько) містить батька (і тільки одного з батьків) контекстного вузла, якщо такий є.

Припустимо, що я хочу змінити вміст елемента Землі

  на «\u003e\u003e (Маса Землі приймається за 1). У наступному шаблоні (лістинг 7.12) для цього перевіряється, чи містить батько елемента елемент зі строковим значенням «Earth». Лістинг 7.12. Застосування осі parent
  xmlns: xsl = "http://www.w3.org/1999/XSL/Transform"\u003e

The mass of Earth is set to 1.

І ось результат:

.0553
58.65
1516
.983
43.4
.815
116.75
3716
.943
66.8
The mass of Earth is set to 1.
2107
1
128.4

Застосування осі preceding

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

Нехай, наприклад, мені потрібно задати для вмісту елемента

  текст «» (Ця планета розташована далі від Сонця, ніж Меркурій.), якщо розглянута планета дійсно далі від Сонця, ніж Меркурій. Один із способів зробити це - перевірити, чи розташований Меркурій перед розглянутої планетою відповідно до встановленого в документі порядком, за допомогою осі (лістинг 7.13). Лістинг 7.13. Застосування осі preceding
  xmlns: xsl = "http://www.w3.org/1999/XSL/Transform"\u003e
This planet is farther from the Sun than Mercury.

Якщо поточна планета розташована після Меркурія, я можу вставити повідомлення в її елемент

. Результат наступний:
.0553
58.65
1516
.983
43.4
.815
116.75
3716
.943
This planet is farther from the Sun than Mercury.
1
2107
1
This planet is farther from the Sun than Mercury.

Застосування осі preceding-sibling

  містить всіх попередніх братів контекстного вузла. Зауважте, що якщо контекстним вузлом є вузол атрибута або вузол простору імен, вісь буде порожня.

Що, якщо, наприклад, вам потрібно створити шаблон, який буде вибирати тільки елементи

  в елементі Меркурія? Для цього можна перевірити, чи існують брати, попередні елементу, які є елементами зі строковим значенням «». Якщо застосувати вісь (лістинг 7.14), пошук буде обмежений поточним елементом, що означає, що Меркурій не буде вибрано, якщо ви тільки не перебуваєте в потрібному елементі. Лістинг 7.14. Застосування осі preceding-sibling
  xmlns: xsl = "http://www.w3.org/1999/XSL/Transform"\u003e

А ось результат:

.0553
58.65
1516
.983
This is the planet Mercury, closest to the Sun.
.815
116.75
3716
.943
66.8
1
2107
1
128.4

Застосування осі self

  містить тільки контекстний вузол. Відповідно до одного з скорочень XPath, як ми побачимо далі, замість «» можна використовувати «.».

Цю вісь корисно мати на увазі, оскільки, як ви пам'ятаєте з глави 4, якщо не поставити вісь, віссю за замовчуванням буде

, А в деяких випадках вам може знадобитися звернутися до діючого вузла. Наприклад, прийме значення істини тільки якщо контекстним вузлом буде елемент.

У наступному прикладі я поєдную шаблони для елементів

  і в один шаблон. Оскільки у цих елементів різний формат, я повинен звертатися з ними по-різному всередині одного і того ж шаблону (що можна зробити перевіркою значень осі, яка повертає непорожній набір вузлів, якщо контекстним, вузлом є елемент, і, що повертає непорожній набір вузлів, якщо контекстним вузлом є елемент):

На цьому ми завершуємо розгляд нових осей XPath. Давайте перейдемо до прикладів.

Приклади шляхів розташування

Ми вивчили досить теорії шляхів розташування. Але, зрозуміло, найкраще освоювати цей матеріал на прикладах, тому я наводжу наступний список прикладів шляхів розташування (скорочені варіанти розглядаються після цього списку):

  . Повертає дочірні елементи контекстного вузла; . Повертає всі дочірні текстові вузли контекстного вузла; . Повертає всіх дітей контекстного вузла; . Повертає атрибут контекстного вузла; . Повертає всі елементи-нащадки контекстного вузла; . Повертає всіх предків контекстного вузла; . Повертає предків контекстного вузла. Якщо контекстним вузлом теж є, повертає також контекстний вузол; . Для отримання елементів-нащадки контекстного вузла. Якщо контекстним вузлом теж є, повертає також контекстний вузол; . Повертає контекстний вузол, якщо їм є елемент;
child :: PLANET / descendant :: NAME
. Для отримання елементів-нащадки дочірніх елементів контекстного вузла; . Повертає всіх онуків контекстного вузла; . Повертає кореневої вузол; . Повертає всі елементи в документі;
/ Descendant :: PLANET / child :: NAME
. Повертає всі елементи з батьком в документі; . Повертає третю дитину контекстного вузла;
child :: PLANET
. Повертає останню дитину контекстного вузла;
/ Descendant :: PLANET
. Повертає третій елемент в документі;
child :: PLANETS / child :: PLANET / child :: NAME
. Повертає третій елемент четвертого елемента елемента; . Повертає всіх дітей контекстного вузла після перших трьох;
preceding-sibling :: NAME
. Повертає другий попередній елемент-брат контекстного вузла;
child :: *
. Повертає дітей і контекстного вузла.
child :: *
. Повертає останню дитину або контекстного вузла.

Як бачите, синтаксис деяких виразів досить заплутаний, і набирати їх також досить довго. Але, як і для зразків, існує скорочена форма синтаксису XPath.

Скорочений синтаксис XPath

Скорочення синтаксису XPath можуть бути досить зручними. Нижче наведені правила:

  може бути скорочено як; може бути скорочено як; може бути скорочено як; може бути скорочено як; може бути скорочено як.

Наприклад, шлях розташування

  - скорочення для
self :: node () / descendant-or-self :: node () / child :: PLANET
. Можна також скоротити вираз предиката як, як і т.д. Працювати з шляхами розташування XPath за допомогою скороченого синтаксису значно простіше. У наступному списку перераховано ряд прикладів шляхів розташування з використанням скороченого синтаксису: повертає дочірні елементи контекстного вузла; повертає всі дочірні елементи контекстного вузла; повертає всі дочірні текстові вузли контекстного вузла; повертає атрибут контекстного вузла; повертає всі атрибути контекстного вузла; повертає третю дитину контекстного вузла; повертає останню дитину контекстного вузла; повертає всіх онуків контекстного вузла; повертає другий елемент третього елемента елемента; повертає всіх нащадків кореня документа; повертає елементи-нащадки дочірніх елементів контекстного вузла; повертає всі елементи, у яких є батько; повертає сам контекстний вузол; повертає елементи-нащадки контекстного вузла; повертає батька контекстного вузла; повертає атрибут батька контекстного вузла; повертає всіх батьків нащадка контекстного вузла і батька контекстного вузла; повертає дітей контекстного вузла, у яких є діти; повертає дітей контекстного вузла, у яких є діти з текстом, рівним «Venus»; повертає всіх дітей контекстного вузла, у яких є атрибут зі значенням «»; повертає шосту дитину контекстного вузла, тільки якщо у цієї дитини є атрибут зі значенням «days». Можна також написати; повертає всіх дітей контекстного вузла, у яких є атрибут і атрибут;
// PLANET
"Вибирає всі елементи, значення яких відмінно від значення будь-якого попереднього елемента; вибирає будь-який елемент, який є першою дитиною свого батька; вибирає перше п'ятьох дітей контекстного вузла, у яких є атрибут.

Перевірка виразів XPath

У пакет Xalan входить зручна програма-приклад, ApplyXPath.java, що дозволяє застосувати вираз XPath до документа і подивитися на результат, що дуже допомагає при тестуванні. Для запуску цього прикладу вам потрібно буде скомпілювати

  в за допомогою утиліти java.exe, що входить в поставку Java.

Як приклад я застосую вираз XPath «

»До за допомогою. Нижче показаний результат, що відображає всі елементи, дочірні по відношенню до елементів (теги додані програмою ApplyXPath):
% Java ApplyXPath planets.xml PLANET / NAME
MercuryVenusEarth

XPath 2.0

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 - це мова запитів до елементів xml або xhtml документа. Також як SQL, xpath є декларативною мовою запитів. Щоб отримати дані, що цікавлять, необхідно всього лише створити запит, що описує ці дані. Всю «чорну» роботу за вас виконає інтерпретатор мови xpath.
  Дуже зручно, чи не так? Давайте подивися які можливості пропонує xpath для доступу до вузлів веб-сторінок.

Створення запиту до вузлів веб-сторінок

  Пропоную вашій увазі невелику лабораторну роботу, в ході якої я продемонструю створення xpath запитів до веб-сторінці. Ви зможете повторити наведені мною запити і, найголовніше, спробуєте виконати свої. Я сподіваюся, що завдяки цьому стаття буде однаково цікава новачкам і програмістам знайомим з xpath по xml.

Для лабораторної нам знадобляться:
   - веб-сторінка xhtml;
   - браузер Mozilla Firefox з доповненнями;
   - firebug;
   - firePath;
   (Ви можете використовувати будь-який інший браузер з візуальної підтримкою xpath)
   - небагато часу.

Як веб-сторінки для проведення експерименту пропоную головну сторінку сайту консорціуму всесвітньої павутини ( "http://w3.org"). Саме ця організація розробляє мови xquery (xpath), специфікацію xhtml і багато інших стандарти інтернету.

завдання
  Отримати з xhtml-коду головної сторінки  w3.org інформацію про конференції консорціуму за допомогою запитів xpath.
  Приступимо до написання xpath запитів.
Перший Xpath запит
  Відкриваємо закладку Firepath в FireBug, виділяємо з селектором елемент для аналізу, натискаємо: Firepath створив xpath запит до вибраного елементу.

Якщо ви виділили заголовок першої події, то запит буде таким:

   / a

Після видалення зайвих індексів запит стане відповідати всім елементам типу «заголовок».

Firepath підсвічує елементи, які відповідають запиту. Ви можете в реальному часі побачити, які вузли документа відповідають запиту.

Запит для отримання інформації про місця проведення конференцій:
   .//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Так ми отримаємо список спонсорів:
   .//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

синтаксис xpath

  Давайте повернемося до створених запитам і розберемося в тому, як вони влаштовані.
  Розглянемо докладно перший запит

У цьому запиті я виділив три частини для демонстрації можливостей xpath. (Поділ на частини уловное)

Перша частина
.//   - рекурсивний спуск на нуль або більше рівнів ієрархії від поточного контексту. У нашому випадку поточний контекст це корінь документа

Друга частина
*   - будь-який елемент,
[@ Id = "w3c_home_upcoming_events"] - предикат, на основі якого здійснюємо пошук вузла, що має атрибут id рівним "w3c_home_upcoming_events". Ідентифікатори елементів XHTML повинні бути унікальні. Тому запит «будь-який елемент з конкретним ID» повинен повернути єдиний шуканий нами вузол.

Ми можемо замінити *   на точне ім'я вузла div  в цьому запиті
   div [@ id = "w3c_home_upcoming_events"]

Таким чином, ми спускаємося по дереву документа до потрібного нам вузла div [@ id = "w3c_home_upcoming_events"]. Нас абсолютно не хвилює, з яких вузлів складається DOM-дерево і скільки рівнів ієрархії залишилося вище.

Третя частина
/ Ul / li / div / p / a  -xpath-шлях до конкретного елемента. Шлях складається з кроків адресації і умови перевірки вузлів (ul, li і т.д.). Кроки поділяються символом "/" (коса риска).

колекції xpath
  Не завжди вдається отримати доступ до цікавого вузлу за допомогою предиката або кроків адресації. Дуже часто на одному рівні ієрархії знаходиться наскільки вузлів однакового типу і необхідно вибрати «тільки перші» або «тільки другі» вузли. Для таких випадків передбачені колекції.

Колекції xpath дозволяють отримати доступ до елементу по його індексу. Індекси відповідають тому порядку, в якому елементи були представлені в оригінальному документі. Порядковий номер у колекціях відраховується від одиниці.

Виходячи з того, що «місце проведення» завжди другий параграф після «назви конференції», отримуємо наступний запит:
   .//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
  Де p - другий елемент в наборі для кожного вузла списку / ul / li / div.

Аналогічно список спонсорів ми можемо отримати запитом:
   .//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Деякі функції хpath
  У хpath існує безліч функцій для роботи з елементами всередині колекції. Я приведу тільки деякі з них.

last ():
  Повертає останній елемент колекції.
  Запит ul / li / div / p - поверне останні параграфи для кожного вузла списку «ul».
  Функція first () не передбачена. Для доступу до першого елементу використовуйте індекс «1».

text ():
  Повертає тестове зміст елемента.
   .//a - отримуємо все посилання з текстом «Archive».

position () і mod:
  position () - повертає позицію елемента в множині.
  mod - залишок від ділення.

Комбінацією даних функцій можемо отримати:
   - Чи не парні елементи ul / li
   - парні елементи: ul / li

операції порівняння

  • < - логическое «меньше»
  • \u003e - логічне «більше»
  • <= - логическое «меньше либо равно»
  • \u003e = - логічне «більше або дорівнює»
   ul / li, ul / li - елементи списку починаючи з 3го номера і навпаки.

Для вибору вузлів і наборів вузлів в XML документі XPath використовує вирази шляхів. Вузол вибирається слідуючи по заданому шляху або по, так званим, кроків.

Приклад XML документа

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

нагадування Відправити лист! Re: Нагадування Лист відправлено

вибір вузлів

Щоб вибрати вузли в XML документі, XPath використовує вирази шляху. Вузол вибирається слідуючи по заданому шляху. Найбільш корисні вирази шляху:

У наступній таблиці наводяться деякі вирази XPath, що дозволяють зробити деякі вибірки по демонстраційного XML документу:

вираз XPath результат
messages Вибирає всі вузли з ім'ям "messages"
/ messages Вибирає кореневий елемент повідомлень
Примітка: Якщо шлях починається з косою риси (/), то він завжди представляє абсолютний шлях  до елементу!
messages / note Вибирає всі елементи note, є нащадками елемента messages
// note Вибирає всі елементи note незалежно від того, де в документі вони знаходяться
messages // note Вибирає всі елементи note, є нащадками елемента messages незалежно від того, де вони знаходяться від елемента messages
// @ date Вибирає всі атрибути з ім'ям date

предикати

Предикати дозволяють знайти конкретний вузол або вузол з конкретним значенням.

Предикати завжди полягають в квадратні дужки.

У наступній таблиці наводяться деякі вирази XPath з предикатами, що дозволяють зробити вибірки по демонстраційного XML документу:

вираз 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"

Вибір невідомих заздалегідь вузлів

Щоб знайти невідомі заздалегідь вузли XML документа, XPath дозволяє використовувати спеціальні символи.

У наступній таблиці наводяться деякі вирази XPath зі спецсимволами, що дозволяють зробити вибірки по демонстраційного XML документу:

Вибір декількох шляхів

Використання оператора | в вираженні XPath дозволяє робити вибір по декількох шляхах.

У наступній таблиці наводяться деякі вирази XPath, що дозволяють зробити вибірки по демонстраційного XML документу.

У цьому розділі на основі деяких прикладів демонструється базовий синтаксис XPath.

Приклад XML документа

В якості прикладу візьмемо наступний XML документ:

нагадування Відправити лист! 4 Re: Нагадування Лист відправлено 7

Завантаження XML документа

Для завантаження XML документа використовується об'єкт XMLHttpRequest, який підтримується всіма основними браузерами.

Var xmlhttp = new XMLHttpRequest ();

У старих браузерах Microsoft (IE 5 і 6) використовується код:

Var xmlhttp = new ActiveXObject ( "Microsoft.XMLHTTP");

вибір вузлів

На жаль різні браузери підтримують різні способи для роботи з XPath.

Chrome, Firefox, Edge, Opera і Safari для вибору вузлів використовують метод evaluate ():

XmlDoc.evaluate (xpath, xmlDoc, , XpathResult.ANY_TYPE, null);

Internet Explorer використовує метод selectNodes ():

XmlDoc.selectNodes (xpath);

Вибір всіх заголовків

У наступному прикладі вибираються всі вузли heading:

   / Messages / note / heading

Вибір заголовка нотатку

У наступному прикладі вибирається заголовок heading першого вузла note елемента messages:

   / Messages / note / heading

Вибір всіх відділів

У наступному прикладі вибирається текст з усіх вузлів desk:

   / Messages / note / desk

Вибираємо відділи з номером більше 4

У наступному прикладі вибираються всі вузли desk, значення яких більше 4:

   / Messages / note / desk

Вибираємо заголовки заміток для відділів з номерами більше 4

У наступному прикладі вибираються всі вузли heading тих вузлів note, у елемент desk яких значення більше 4:

   / Messages / note / heading