Основные элементы путей адресации
Здесь стоит остановиться и вспомнить, что 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:: можно заменить на // 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 - возвращает версию XSL-T процессора. xsl:vendor - возвращает производителя XSL-T процессора. xsl:vendor-url - возвращает URL идентифицирующий производителя. Если используется неизвестный параметр, функция возвращает пустую строку boolean lang (string) - Возвращает истину если у текущего тэга имеется атрибут xml:lang, либо родитель тэга имеет атрибут xml:lang и в нем указан совпадающий строке символ. Функции с множествами * - обозначает любое имя или набор символов, @* - любой атрибут. $name - обращение к переменной, где name - имя переменной или параметра. [] - дополнительные условия выборки. {} - если применяется внутри тега другого языка (например HTML), то XSL-T процессор, то что написанно в фигурных скобках рассматривает как 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?) - Возвращает ссылку на uri определяющий пространство имён. 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) - Возвращает истину, если вторая строка входит в начало первой, иначе возвращает ложь. string normalize-space (string?) - Убирает лишние и повторные пробелы, а так же управляющие символы, заменяя их пробелами. string translate (string, string, string) - Заменяет символы первой строки, которые встречаются во второй строке, на соответствующие по позиции символам из второй строки символы из третьей строки. translate("bar","abc","ABC") - вернет BAr. Логические функции or - логическое "или". and - логическое "и". = - логическое "равно". < (<)- логическое "меньше". > (>)- логическое "больше". <= (<=)- логическое "меньше либо равно". >= (>=)- логическое "больше либо равно". 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) - Округляет число по математическим правилам.
Популярное: Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (214)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |