Дивитися що таке "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.

Для вибору вузлів і наборів вузлів в 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 з практики парсинга інформації з сайтів. Наведено ділянки коду xpath.

Отримати текст Тема h1

   // h1 / text ()

Отримати текст Тема з класом produnctName

   // h1 [@ class = "produnctName"] / text ()

Отримати значення певного span по класу

   // span [@ class = "price"]

Отримати значення атрибута title у кнопки з класом addtocart_button

   // input [@ class = "addtocart_button"] / @ title

   // a / text ()

   // a / @ href

зображення src

   // img / @ src

Зображення відразу за певним елементом в DOM, вісь following

   // h1 [@ class = "produnctName"] // following :: div / img / @ src

Зображення в 4 div по рахунку

   // div / img / @ src

XPath   (XML Path Language) - мова запитів до елементів XML-документа. Розроблено для організації доступу до частин документа XML в файлах трансформації XSLT і є стандартом консорціуму W3C. XPath покликаний реалізувати навігацію по DOM в XML.

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

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

Функції над множинами вузлів

  • * - позначає будь-який   ім'я або набір символів за вказаною осі, наприклад: * - будь-який дочірній вузол; @ * - будь-який атрибут.
  • $ Name - звернення до змінної, де name - ім'я змінної або параметра.
  •   - додаткові умови вибірки або, що те ж саме, предикат кроку адресації. Повинен містити логічне значення. Якщо містить числове, вважається що це порядковий номер вузла, що еквівалентно приписування перед цим числом вираження «position () =»
  • () - якщо застосовується всередині тега іншої мови (наприклад HTML), то XSLT процесор розглядає вміст фігурних дужок як XPath.
  • / - визначає рівень дерева, тобто розділяє кроки адресації
  • | - об'єднує результат. Тобто, можна написати кілька шляхів розбору через знак | і в результат такого виразу увійде все, що буде знайдено будь-яким з цих шляхів.
  • node-set node()

Повертає всі вузли. Замість цієї функції часто використовують замінник "*", але, на відміну від зірочки, функція node () повертає і текстові   вузли.

  • string text()

Повертає набір текстових вузлів;

  • node-set current()

Повертає безліч з одного елемента, який є поточним. Якщо ми робимо обробку безлічі з умовами, то єдиним способом дотягнутися з цієї умови до поточного елемента буде дана функція.

  • number position()

Повертає позицію елемента в множині. Коректно працює тільки в циклі

  • number last()

Повертає номер останнього елемента в множині. Коректно працює тільки в циклі

  • number count(Node-set)

Повертає кількість елементів у node-set.

  • string name(Node-set?)

Повертає повне ім'я першого тега в множині.

  • string namespace-uri(Node-set?)
  • string local-name(Node-set?)

Повертає ім'я першого тега в безлічі, без простору імен.

  • node-set id(Object)

Знаходить елемент з унікальним ідентифікатором

Осі - це база   мови XPath. Для деяких осей існують скорочені позначення.

  • ancestor ::   - Повертає безліч предків.
  • ancestor-or-self ::   - Повертає безліч предків і поточний елемент.
  • attribute ::   - Повертає безліч атрибутів поточного елемента. Це звернення можна замінити на «@»
  • child ::   - Повертає безліч нащадків на один рівень нижче. Ця назва скорочується повністю, тобто його можна зовсім опускати.
  • descendant ::   - Повертає повне безліч нащадків (тобто, як найближчих нащадків, так і всіх їх нащадків).
  • descendant-or-self ::   - Повертає повне безліч нащадків і поточний елемент. Вираз «/ descendant-or-self :: node () /" можна скорочувати до «//» . За допомогою цієї осі, наприклад, можна другим кроком організувати відбір елементів з будь-якого вузла, а не тільки з кореневого: досить першим кроком взяти всіх нащадків кореневого. Наприклад, шлях «// span» відбере всі вузли span документа, незалежно від їх положення в ієрархії, глянувши як на ім'я кореневого, так і на імена всіх його дочірніх елементів, на всю глибину їх вкладеності.
  • following ::   - Повертає необроблене безліч, нижче поточного елемента.
  • following-sibling ::   - Повертає безліч елементів на тому ж рівні, що настають за поточним.
  • namespace ::   - Повертає безліч, що має простір імен (тобто присутній атрибут xmlns).
  • parent ::   - Повертає предка на один рівень назад. Це звернення можна замінити на «..»
  • preceding ::   - Повертає безліч опрацьованих елементів виключаючи безліч предків.
  • preceding-sibling ::   - Повертає безліч елементів на тому ж рівні, що передують поточному.
  • self ::   - Повертає поточний елемент. Це звернення можна замінити на «.»

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 має деревоподібну структуру. У документі завжди є кореневий елемент (інструкція   до дерева відношення не має). У елемента дерева завжди існують нащадки і предки, крім кореневого елемента, у якого предків немає, а також тупикових елементів (листя дерева), у яких немає нащадків. Кожен елемент дерева знаходиться на певному рівні вкладеності (далі - «рівень»). У елементів на одному рівні бувають попередні та наступні елементи.

Це дуже схоже на організацію каталогів в файлової системі, і рядки XPath, фактично, - шляху до «файлам» - елементам.

Наприклад, розглянемо XHTML документ:

<html\u003e <body\u003e <div\u003eперший шар<span\u003eблок тексту в першому шарі</ Span\u003e </ Div\u003e <div\u003eдругий шар</ Div\u003e <div\u003eтретій шар<span class = "text"\u003eперший блок в третьому шарі</ Span\u003e <span class = "text"\u003eдругий блок в третьому шарі</ Span\u003e <span\u003eтретій блок в третьому шарі</ Span\u003e </ Div\u003e <img /\u003e </ Body\u003e </ Html\u003e

XPath-шлях / Html / body / * / span [@class]   (Повний синтаксис має вигляд / Child :: html / child :: body / child :: * / child :: 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() Повертає позицію елемента в множині. Коректно працює тільки в циклі    number last() Повертає номер останнього елемента в множині. Коректно працює тільки в циклі    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 - логічне «і»
  • = - логічне «дорівнює»
  • < (<) - логическое «меньше»
  • \u003e (\u003e) - логічне «більше»
  • <= (<=) - логическое «меньше либо равно»
  • \u003e = (\u003e =) - логічне «більше або дорівнює»
   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) Округлює число за математичними правилами.