Смекни!
smekni.com

на тему: Язык xml. Язык запросов X query (стр. 12 из 14)

Следующего шага нет, поэтому будет производиться фильтрация отобранного набора. В этом и состоит отличие предикатов от шагов адресации. На каждом шаге адресации получаем новый набор, отталкиваясь от контекста, полученного на предыдущем шаге. В ходе же обработки предиката новый набор получается из текущего методом фильтрации, когда из набора исключаются узлы, не прошедшие условие проверки. В данном случае ось 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 - логическое "и".

= - логическое "равно".

< (&lt;)- логическое "меньше".

> (&gt;)- логическое "больше".

<= (&lt;=)- логическое "меньше либо равно".

>= (&gt;=)- логическое "больше либо равно".

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) - Округляет число по математическим правилам.

Способы просмотра XML-документов

XML никак не определяет способ отображения и использования описываемых с его помощью элементов документа, т.е. программе-анализатору предоставляется возможность самой выбирать нужное оформление. Этого требует принцип независимости определения внутренней структуры документа от способов представления этой информации. Например, задавая в документе элемент <flower>роза</flower>, мы лишь указываем, что rose в данном случае является цветком, но информации о том, как должен выглядеть данный элемент документа на экране клиента и должен ли он отображаться вообще, в таком определении нет.

Для того чтобы использовать данные, определяемые элементами XML, например, отображать их на экране пользователя, необходимо написать программу-анализатор, которая бы выполняла эти действия. Уже сегодня таких программ появилось достаточное количество и у разработчиков существует возможность выбора наиболее подходящей из них для решения конкретных проблем.

Как уже отмечалось ранее, в общем случае, программы- анализаторы можно разделить на две группы: верифицирующие (т.е. использующие DTD- описания для определения корректности документа) и не верифицирующие. Если создать свой язык и описывать его грамматику на основе DTD, то для анализа документов, написанных на этом языке, безусловно, потребуется программа, проверяющая корректность составления документа. Но так как использование DTD в XML не является обязательным, то любой правильно оформленный документ может быть распознан и разобран программой, предназначенной для анализа XML- документов. В любом случае, используя универсальные XML- анализаторы, можно быть уверенным в том, что если заданные в документе конструкции языка являются синтаксически правильными, то программа-анализатор сможет правильно извлечь определяемые ими элементы документа и передать их прикладной программе, выполняющей необходимые действия по отображению. Т.е. после разбора документа в большинстве случаев, предоставляется объектная модель, отображающая содержимое документа, и средства, необходимые для работы с ней (прохода по дереву элементов). При этом в некоторых анализаторах способ представления структуры документа основывается на спецификации DOM. Поэтому появляется также возможность использовать строгую иерархическую модель DOM для построения собственных документов.