Современные методы репрезентации данных Лектор: старший преподаватель кафедры ИТ Масленников Вадим Олегович Лекция 5 XPath Введение в XSLT XPath — язык для навигации внутри документа Назначение XPath: выбирать из документа узлы или значения, которые нужны для совершения с ними каких-л. операций (напечатать, подсчитать, преобразовать…) Основные понятия: узел (node) документа атомарное значение (atomic value) узлами являются не только элементы, но и их атрибуты (attribute node), текстовое содержимое (text node) и т. д. число, строка, дата или булево значение последовательность (sequence) Выражение на XPath (путь) выбирает в документе последовательность узлов или атомарных значений, отвечающих заданным условиям Последовательность может состоять из 0 или 1 члена XPath — основные элементы Основные понятия: корень документа элементы атрибуты абсолютный и относительный путь родитель-дети предки-потомки сиблинги (узлы одного уровня) XPath — простые выражения Простые выражения путь от корня (абсолютный) начинается с / фрагмент пути между двумя / — шаг по дереву (по умолчанию — от корня к листьям) в результат входят все узлы, подходящие под описанный путь /booklist ; /booklist/book/author путь без / (относительный) считается не от корня, а от текущей позиции book/author // любое количество шагов //book ; //author ; /booklist//author XPath — узлы и аттрибуты Простые выражения . (точка) Текущий узел .. (две точки) Родительский узел ../title (путь от book/author к book/title) * Узел с любым именем /booklist/* все дети booklist /booklist/*/* все внуки booklist @ Атрибут //book/@lang атрибут по имени lang //book/@* все атрибуты node() Любой узел text() Узел с текстовым содержимым XPath — узлы /library/book/chapter/* выбор всех дочерних узлов любого узла chapter каждого узла book в library //book/* выбор всех дочерних узлов всех book /*/*/*/paragraph выбор всех paragraph которые имеют трех родителей //* выбор всех элементов документа XPath — аттрибуты Аттрибут можно выбирать по его имени или по узлу, котором он находится Аттрибут состоит из имени и значения, например в <chapter num="5">, имя аттрибута num, значение 5 Для выбора аттрибута по имени используется префикс @ @num выбирает аттрибут с именем num //@* выбирает ВСЕ аттрибуты в документе Для выбора аттрибута по узлу необходимо его имя с префиксом заключить в квадратные скобки //chapter[@num] выбирает каждый chapter элемент в любом месте документа, который содержит аттрибут num XPath — аттрибуты. примеры //chapter[@num] выбирает все chapter узлы с аттрибутом num //chapter[not(@num)] выбирает все chapter узлы, которые не содержат аттрибута num //chapter[@*] выбирает все chapter узлы, которые содержат любые аттрибуты //chapter[not(@*)] выбирает все chapter узлы, которые не содержат аттрибутов XPath — аттрибуты. значения //chapter[@num='3'] выбирает все chapter узлы с аттрибутом num равным 3 Функция normalize-space() используется для отсекания правых и левых пробелов в значении при сравнении, например //chapter[normalize-space(@num)="3"] XPath — условия и выражения Выражения с условием (предикатом) условие на номер узла в последовательности book[2] ; book[last()] ; book[position()<3] условие на значение дочерних элементов (путь отсчитывается от текущей позиции) book[city="Москва"] book[price>250] условие на значение атрибутов //book[@lang="rus"]/title Условие […] применяется к тому узлу, после которого стоит book[2]/author vs. book/author[2] XPath — арифметические выражения + * div mod сложение вычитание умножение (не / !!!) деление остаток от деление XPath — проверка на еквивалентность = “равно” (Не == !!!) != “не равно” value = node-set истина, если node-set содержит любой узел, равный value value != node-set истина, если node-set содержит любой узел, не равный value Замечание: value=node-set и value!=node-set могут быть истины одновременно !!! XPath — логические операторы and or Пример: count = 0 or count = 1 not()(функция) Для числовых сравнений: < “меньше чем” Иногда необходимо использовать &lt; <= “меньше чем или равно” Иногда необходимо использовать &lt;= Аналогично > или &gt; >= или &gt;= XPath — некоторые функции count(elem) количество выбраных узлов name() возвращает имя узла Пример: //*[name()='section'] аналогично //section starts-with(arg1, arg2) проверяет начинается ли arg1 с arg2 Пример: //chapter[count(section)=1] selects chapters с строго одним дочернем узлом section Пример: //*[starts-with(name(), 'sec'] contains(arg1, arg2) проверяет, содержит ли arg1 в себе arg2 Пример: //*[contains(name(), 'ect'] XPath — оси Оси (axes, ед.ч. axis) Оси задают «направление движения» в конкретном шаге В полном виде шаг выглядит так: … /имя_оси::узел[условие]/ … … /sibling::book[25]/ … Ось по умолчанию — child /booklist/child::book = /booklist/book XPath — оси Оси (axes) 1. 2. 3. 4. 5. 6. 7. 8. child parent sibling self ancestor ancestor-or-self descendant descendant-or-self 9. 10. 11. 12. 13. 14. preceding following preceding-sibling following-sibling attribute namespace XPath — оси. пример Начиная от текущего узла, оси self, preceding, following, ancestor, и descendant формируют наборы всех узлов (не рссматривая пространства имен и аттрибуты) <library> <book> <chapter/> <chapter> <section> <paragraph/> <paragraph/> </section> </chapter> <chapter/> </book> <book/> </library> //chapter[2]/self::* //chapter[2]/preceding::* //chapter[2]/following::* //chapter[2]/ancestor::* //chapter[2]/descendant::* XPath — оси. дерево То же, только в вид синтаксического дерева library ancestor following book[2] book[1] preceding chapter[1] self chapter[2] chapter[3] section[1] descendant paragraph[1] paragraph[2] XPath — оси. примеры //book/descendant::* все потомки каждого book //book/descendant::section все потомки section каждого book //parent::* любой элемент, являющийся родителем //section/parent::* любой родитель узла section //parent::chapter любой узел chapter который евляется родителем (т.е. имеет дочерние узлы) /library/book[3]/following::* каждый узел book в библиотеке по номеру больше 3 XPath — оси. Другие оси ancestor-or-self:: родители + текущий узел descendant-or-self:: потомки + текущий узел attribute:: все аттрибуты текущего узла namespace:: все пространсва имен текущего узла preceding:: все перед текущим узлом в XML документе following-sibling:: все узлы после текущего на этом же уровне preceding-sibling:: все узлы перед текущем на этом же уровне Замечание: preceding-sibling:: и following-sibling:: неприменимы к аттрибутам и пространствам имен XPath — оси. Сокращения (none) можно заменить на child:: @ можно заменить на attribute:: . можно заменить на self::node() .//X можно заменить на self::node()/descendant-or-self::node()/child::X .. можно заменить на parent::node() ../X можно заменить на parent::node()/child::X // можно заменить на /descendant-or-self::node()/ //X можно заменить на /descendant-or-self::node()/child::X Введение в XSLT Преобразования XML-данных (XSLT) XML ничего сам не делает. Его задача — описывать структуру данных Чтобы с этими данными что-то сделать, используются специальные средства XSL — eXtensible Stylesheet Language XSLT: XSL Transformations XSLT выполняет преобразования данных XSL-FO: XSL Formatting Objects XSL-FO форматирует данные для печати Преобразования XSLT Преобразования XSLT Что умеет делать XSL? Отбирать (фильтровать) определённые данные из целого документа Упорядочивать данные независимо от исходного порядка Менять исходную структуру данных (до неузнаваемости ) Преобразовывать XML в другой XML в правильный HTML в другие текстовые форматы (RTF,PDF,DOC) и графические тоже (svg) Преобразования XSLT В отличие от многих языков программирования (BASIC, Pascal, C,…), XSL — не процедурный язык, а функционально-декларативный. Программа на XSL (transformation, она же stylesheet) сообщает не что нужно делать (последовательность операций), а что должно получиться. Преобразования XSLT Программа на XSL состоит из шаблонов (templates), которые сопоставляются с различными частями дерева XML на входе и выдают некоторый выход. Что дальше ??? XSLT - eXtensible Stylesheet Language Transformations Вопросы ???