Язык скриптования сайтов Parser 3

         

Stringformat


format. Вывод числа в заданном формате


^строка.format[форматная_строка]


Метод выводит значение переменной в заданном формате (см. Форматные строки).

Выполняется автоматическое преобразование строки к числу.

Пример

$var[15.67678678]

^var.format[%.2f]


Возвратит: 15.68



Stringintdouble




int, double. Преобразование строки к числу


^строка.int[]  

^строка.int(значение по умолчанию)  

^строка.double[]  

^строка.double(значение по умолчанию)

Преобразуют значение переменной $строка к целому или вещественному числу соответственно, и возвращает это число.

Можно задать значение по умолчанию, которое будет получено, если преобразование невозможно или строка пуста или состоит только из "white spaces" (символы пробела, табуляция, перевода строки).

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

Внимание: использование пустой строки в математических выражениях не является ошибкой, ее значение считается нулем.

Внимание: преобразование строки, не являющейся целым числом к целому числу является ошибкой (пример: строка «1.5» не является целым числом).

Примеры использования

$str[123]

^str.int[]


Выведет число 123, поскольку объект str можно преобразовать к классу int.

$str[много]

^str.double(-1)

Выведет число -1, поскольку преобразование невозможно.

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 09.02.2004



Stringlength


length. Длина строки


^строка.length[]   

Возвращает длину строки.

Пример

$str[О, сколько нам открытий чудных!…]

^str.length[]


Вернет: 32



Stringlit


Строковые литералы


В коде Parser могут использоваться любые буквы, включая русские. Следующие символы являются служебными:

^   $   ;   (   

)   [   ]   {   

}   "   :      


Чтобы отменить специальное действие этих символов, их необходимо предварять символом ^. Например, для получения в тексте символа $ нужно записать ^$.

Кроме того, допустимо использовать код символа:

^#20 - пробел

^#XX - XX hex код буквы

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 24.11.2003



Stringltrt


left, right. Подстрока слева и справа


^строка.left(N)  

^строка.right(N)   

Методы возвращают N первых или последних символов строки соответственно. Если длина строки меньше N, то возвращается вся строка.

Пример

$str[О, сколько нам открытий чудных!…]

^str.left(10) ^str.right(10)

На экран будет выведено: О, сколько чудных!…



Stringmatch


match. Поиск подстроки по шаблону


^строка.match[шаблон]

^строка.match[шаблон][опции поиска]

Осуществляет поиск в строке по шаблону.

Шаблон - это регулярное выражение, совместимое с PCRE (Perl compatible regular expressions).

Частичный перевод описания PCRE приведен в Приложении 4.

Предусмотрены следующие опции поиска:

i - не учитывать регистр;

x - игнорировать символы white space и разрешить #комментарий до конца строки;

s - символ $ считать концом всего текста (опция по умолчанию);

m - символ $ считать концом строки, но не всего текста;

g - найти все вхождения строки (а не только первое);

' - вычислять значения столбцов prematch, match, postmatch.

Поскольку символы ^ и $ используются в Parser, в шаблоне вместо символа ^ используется строка ^^, а вместо символа $ - строка ^$ (см. Литералы).

Если в шаблоне не используются круглые скобки, то оператор возвращает булевое значение истина при обнаружении подстроки, соответствующей шаблону, или ложь, если совпадений не найдено.

Если в шаблоне используются круглые скобки, то вместо булевого значения оператор создает таблицу совпадений (объект класса table) со столбцами prematch, match, postmatch, 1, 2,…, n,

где:

prematch   столбец с подстрокой от начала строки до совпадения   

match      столбец с подстрокой, совпавшей с шаблоном   

postmatch   столбец с подстрокой, следующей за совпавшей подстрокой до конца строки   

1, 2,…, n   столбцы с подстроками, соответствующими фрагментам шаблона, заключенным в круглые скобки, n - номер открывающей круглой скобки

Если указана опция поиска g, будет создана таблица найденного по шаблону (по одной строке на каждое вхождение).

При этом не важно, есть в шаблоне круглые скобки или нет.

Внимание: значения столбцов prematch, match, postmatch вычисляются только если указана опция ' .



Примеры использования

$str[www.parser.ru?user=admin]

^if(^str.match[

    \? #есть разделитель

    .+ #и есть хоть что-то за ним

][x]){Есть совпадение}{Совпадений нет}



Выведет на экран: Есть совпадение.

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

$str[www.parser.ru?user=admin]

$mtc[^str.match[(\?.+)][']]

^mtc.save[match.txt]



Создаст файл match.txt, содержащий такую таблицу:

prematch

match

postmatch

1

www.parser.ru

?user=admin

?user=admin

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 24.03.2004

Stringmatchreplace


match. Замена подстроки, соответствующей шаблону


^строка.match[шаблон][опции поиска]{замена}   

Осуществляет поиск в строке по шаблону и производит замену совпавшей подстроки на заданную. Механизм поиска устроен так же, как и у предыдущего метода. Внутри кода замены доступна автоматически создаваемая таблица совпадений match, которая была рассмотрена выше. Дополнительно можно задать еще одну опцию поиска:

g - задает замену всех совпавших подстрок

Пример

$str[2002.01.01]

^str.match[(\d+)\.(\d+)\.(\d+)][g]{Год $match.1, месяц $match.2, число $match.3}


Выведет: Год 2002, месяц 01, число 01.



Stringmid


mid. Подстрока с заданной позиции


^строка.mid(P;N)

^строка.mid(P)   

Возвращает подстроку, которая начинается с позиции P и имеет длину N (если N не задано, то возвращается подстрока с позиции P до конца строки). Отсчет P начинается с нулевой позиции. Если P+N больше длины строки, то будут возвращены все символы строки, начиная с позиции P.

Пример

$str[О, сколько нам открытий чудных!…]

^str.mid(3;20)


Выведет на экран: сколько нам открытий



Stringpos


pos. Получение позиции подстроки


^строка.pos[подстрока]   

Возвращает число int - позицию первого символа подстроки в строке (начиная с нуля), или -1, если подстрока не найдена.

Пример

$str[полигон]

^str.pos[гон]

Вернет: 4



Stringreplace


replace. Замена подстрок в строке


^строка.replace[$таблица_подстановок]   

Эффективно заменяет подстроки в строке в соответствии с таблицей подстановок, работает существенно быстрее match.

Таблица подстановок - объект класса table, содержащая два столбца:

первый - подстрока, которую нужно заменить,

второй - подстрока, которая появится на месте подстроки из первого столбца после замены.

Имена столбцов несущественны, можно называть их from/to, или вообще никак не называть, воспользовавшись nameless таблицей.

Пример

$s[A magic moment I'll remember!]

Исходная строка: $s<br>

$rep[^table::create{from   to

A An

magic   ugly}]

Исковерканная строка: ^s.replace[$rep]


Выведет на экран:

Исходная строка: A magic moment I'll remember!

Исковерканная строка: An ugly moment I'll remember!



Stringsave


save. Сохранение строки в файл


^строка.save[имя_файла_с_путем]   

^строка.save[append;имя_файла_с_путем]   

Сохраняет или добавляет строку в файл по указанному пути.

При этом с фрагментами строки производятся необходимые преобразования, см. «Преобразование данных».

Пример

Задача: из SQL-сервера А достать данные, положить в SQL-сервер Б.

Если оба SQL-сервера доступны с какой-то машины, можно так:

^connect[А]{

    $data[

#       код, наполняющий data данными из SQL-сервера A

    ]

    ^connect[Б]{

         ^void:sql{insert into table x (x) values ('$data')}

    }

}


При этом $data в SQL-запросе insert будет правильно обработан по правилам SQL-диалекта сервера Б.

Однако если оба SQL-сервера недоступны одновременно с какой-то машины, можно так:

^connect[А]{

    $data[

#       код, наполняющий data данными из SQL-сервера A

    ]

    $string[^untaint[sql]{insert into table x (x) values ('$data')}]

    ^connect[локальный фиктивный Б]{

#       это соединение нужно только для того, 

#       чтобы задать правила обработки для SQL-диалекта сервера Б

        ^string.save[B-inserts.sql]

    }

}


При этом в файл B-inserts.sql запишется правильно обработанный SQL-запрос.

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 12.02.2004



Stringsplit


split. Разбиение строки


^строка.split[разделитель]

^строка.split[разделитель;опции разбиения]

Разбивает строку на подстроки относительно подстроки-разделителя и формирует объект класса table, содержащий

·либо таблицу со столбцом piece, в который помещаются части исходной строки,  

·либо безымянную таблицу с частями исходной строки в колонках единственной записи.  


Предусмотрены следующие опции разбиения:

l - разбить слева направо (по-умолчанию);

r - разбить справа налево;

h - сформировать безымянную таблицу где части исходной строки помещаются горизонтально;

v - сформировать таблицу со столбцом piece, где части исходной строки помещаются вертикально.

Пример вертикального разбиения

$str[О, сколько нам открытий чудных!…]

$parts[^str.split[нам]]

^parts.save[parts.txt]


Создает на диске файл parts.txt, содержащий следующее:

piece

О, сколько 

открытий чудных!…

Пример горизонтального разбиения

$str[/a/b/c/d]

$parts[^str.split[/;lh]]

$parts.0, $parts.1, $parts.2


Выведет:

, a, b



Stringsql


sql. Получение строки из базы данных


^string:sql{SQL-запрос}  

^string:sql{SQL-запрос}[$.limit(1) $.offset(o) $.default{код}]   

Возвращает строку, полученную из базы данных через SQL-запрос. Результатом выборки должен быть только один столбец из одной строки. Для работы оператора необходимо установленное соединение с сервером базы данных (см. оператор connect).

Необязательные параметры:

$.limit(1) - в ответе заведомо будет содержаться только одна строка

$.offset(o) - отбросить первые o записей выборки

$.default{код} - если ответ SQL-сервера был пуст (0 записей), то будет выполнен указанный код, и строка, которую он возвратит, будет результатом метода

Пример

^string:sql{select name from company where company_id=$company_id}


Используя этот метод, полезно конструировать SQL-запрос так, чтобы в ответе заведомо содержалась одна строка из одного столбца.

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 01.04.2004



Stringtrim


trim. Отсечение букв с концов строки   [3.1.2]


^строка.trim[]

^строка.trim[откуда]

^строка.trim[откуда;буквы]


Метод отсекает буквы с концов строки. По умолчанию отсекаются white space символы с начала и конца строки.

Можно указать, откуда именно отсекать символы, задав одно из значений:

·start - отсекать с начала;

 

·both - отсекать и с начала и с конца;

 

·end - отсекать с конца.

 


Также можно указать те буквы, которые необходимо отсечь.

Пример отсечения white space

$name[ Вася ]

"$name"

"^name.trim[]"


Выведет…

" Вася "

"Вася"


Пример отсечения указанных символов

$path[/section/subsection/]

^path.trim[end;/]


Выведет…

/section/subsection

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 29.03.2004



Stringuplow


upper, lower. Преобразование регистра строки


^строка.upper[]   

^строка.lower[]   

Переводят строку в верхний или нижний регистр соответственно. Для их работы необходимо, чтобы был задан $request:charset.

Пример

$str[Москва]

^str.upper[]

Вернет: МОСКВА.



Table2hash


hash. Преобразование таблицы к хешу с заданными ключами


^таблица.hash[ключ]

^таблица.hash[ключ][опции]

^таблица.hash[ключ][столбец значений]

^таблица.hash[ключ][столбец значений][опции]

^таблица.hash[ключ][таблица со столбцами значений]

^таблица.hash[ключ][таблица со столбцами значений][опции]


Ключ может быть задан, как:

·[строка] - название столбца, значение которого считается ключом;  

·{код} - результат исполнения которого считается ключом;  

·(математическое выражение) - результат вычисления которого считается ключом.  


Метод преобразует таблицу к хешу вида:

$хеш[

        $.значение_ключа[

            $.название_столбца[значение_столбца]

            …

        ]

    …

]


Иными словами, метод создает хеш, в котором ключами являются значения, описанные параметром ключ. При этом каждому ключу ставится в соответствие хеш, в котором для всех столбцов таблицы хранятся ассоциации «название столбца - значение столбца в записи».

Если задан столбец значений, то каждому ключу будет соответствовать хеш с одной ассоциацией «название столбца - значение столбца в записи».

Кроме того, можно задать несколько столбцов значений, для этого необходимо передать дополнительным параметром таблицу, в которой перечислены все необходимые столбцы.

Опции - хеш с опциями преобразования.

$.distinct(0/1)

0=наличие в ключевом столбце одинаковых значений считается ошибкой (по-умолчанию);

1=выбрать из таблицы записи с уникальным ключом.

$.distinct[tables]

создать хеш из таблиц, содержащих строки с ключом. [3.0.8]

Пример

Есть список товаров, в котором каждый товар имеет наименование и уникальный код - id. Есть прайс-лист товаров, имеющихся в наличии. Вместо названия товара используется id товара из списка товаров. Все это хранится в двух таблицах.
Подобные таблицы называются связанными. Нам нужно получить данные в виде «товар - цена», т.е. получить данные сразу из двух таблиц.

Реализация:

# это таблица с нашими товарами

$product_list[^table::create{id   name

1   хлеб

2   колбаса

3   масло 

4   водка

}]

# это таблица с ценами товаров

$price_list[^table::create{id   price

1   6.50

2   70.00

3   60.85

}]

#hash таблицы с ценами по полю id

$price_list_hash[^price_list.hash[id]] 

#перебираем записи таблицы с товарами

^product_list.menu{ 

    $product_price[$price_list_hash.[$product_list.id].price]

#   проверяем - есть ли цена на товар в нашем hash

    ^if($product_price){ 

#       печатаем название товара и его цену

        $product_list.name - $product_price<br>

    }{ 

#       а у этого товара нет цены, т.е. его нет в наличии

        $product_list.name - нет в наличии<br>

    } 

}



В результате получим:

    хлеб - 6.50

    колбаса - 70.00

    масло - 60.85

    водка - нет в наличии


Tableappend


append. Добавление данных в таблицу


^таблица.append{табличные данные}   


Метод добавляет запись в конец таблицы. Формат представления данных - tab-delimited.

Табличные данные должны иметь такую же структуру, как и таблица, в которую добавляются данные.

Пример

$stuff[^table::create{name   pos

Alexander   boss

Sergey     coder

}]

^stuff.append{Nikolay   designer}

^stuff.save[stuff.txt]


Пример добавит в таблицу $stuff новую запись и сохранит таблицу в файл stuff.txt.



Tableclass


Класс table


Класс предназначен для работы с таблицами.

Таблица считается определенной (def), если она не пуста. Числовое значение равно количеству строк таблицы.



Tablecolumns


columns. Получение структуры таблицы.


^таблица.columns[]   


Метод создает именованную таблицу из одного столбца column, содержащего заголовки столбцов исходной таблицы.

Пример

$columns_table[^stuff.columns[]]



Tablecopylocateoptions


Опции копирования и поиска


При копированнии записей из одной таблицы в другую, см…

table::create [3.0.7]

table.join [3.0.7]

и при поиске, см…

table.locate [3.0.8]

можно задать хеш опций:

$.offset(количество строк)

пропустить указанное количество строк таблицы;

$.offset[cur]

с текущей строки таблицы;

$.limit(максимум)

максимум строк, которые можно обработать;

$.reverse(1/0)

1=в обратном порядке. [3.0.8]


Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 09.02.2004



Tablecount


count. Количество строк в таблице


^таблица.count[]


Выдает количество строк в таблице (int).

Пример

$goods[^table::create{   pos   good      price

1   Монитор   1000

2   Системный блок   1500

3   Клавиатура   15}

]

Количество: ^goods.count[]


Выведет:

Количество: 3


В выражениях числовое значение таблицы равно количеству строк:

^if($goods > 2){больше}




Tablecreate


create. Создание объекта на основе заданной таблицы


^table::create{табличные_данные}

^table::create[nameless]{табличные_данные}   


Конструктор создает объект класса table, используя табличные данные, определенные в самом конструкторе.

Табличные данные - данные, представленные в формате tab-delimited, то есть столбцы разделяются символом табуляции, а строки - символом перевода строки. При этом части первой строки, разделенные символом табуляции, рассматриваются как имена столбцов, и создается именованная таблица. Пустые строки игнорируются. Если необходимо получить таблицу без имен столбцов (что не рекомендуется), то перед заданием табличных данных необходимо указать параметр nameless. В этом случае столбцы первой строки воспринимаются конструктором как данные таблицы, а в качестве имен столбцов выступят их порядковые номера, начиная с нулевого.

Пример

$tab[^table::create{name   age

Вова   27

Леша   22}

]


Будет создан объект tab класса table, содержащий таблицу из двух строк с именами столбцов name и age.



Tablecreateclone


create. Копирование существующей таблицы


^table::create[таблица]

^table::create[таблица;опции]

Конструктор создает объект класса table, копируя данные из другой таблицы. Также можно задать ряд опций, контролирующих копирование, см. «Опции копирования».


Пример

$orig[^table::create{name

Вася

Коля

Маша

}]

#сдвигает текущую запись таблицы orig на «Коля»

^orig.offset(1)

#копирует, начиная с текущей записи в orig, не больше 10 записей

$copy[^table::create[$orig;

    $.offset[cur]

    $.limit(10)

]]

^copy.menu{$copy.name}[,]

Выведет…

Коля, Маша



Tablefields


Получение содержимого столбца


$таблица.поле   

Возвращает содержимое столбца поле из текущей строки таблицы.

Пример

$tab.name


Пример вернет значение, определенное в колонке name текущей строки таблицы.



Tableflip


flip. Транспонирование таблицы


^таблица.flip[]   


Создает новую nameless таблицу с записями, полученными в результате транспонирования исходной таблицы. Иными словами, метод превращает столбцы исходной таблицы в строки, а строки в столбцы.

Пример

$emergency[^table::create{id   number

fire   01

police   02

ambulance   03

gas      04

}]

$fliped[^emergency.flip[]]

^fliped.save[fliped.txt]


В результате выполнения кода в файл fliped.txt будет сохранена такая таблица:

0

1

2

3

fire

police

ambulance

gas

01

02

03

04




Tablehash


Получение содержимого текущей строки в виде хеша


$таблица.fields - содержимое текущей строки таблицы в виде хеша.   

Возвращает содержимое текущей строки таблицы в виде хеша. При этом имена столбцов становятся ключами хеша, а значения столбцов - соответствующими значениями ключей.

Использовать этот метод необходимо, если имена столбцов совпадают с именами методов или конструкторов класса table. В таком случае получить их значения напрямую нельзя - Parser будет выдавать сообщение об ошибке. Если необходимо работать с полями, называющимися именно так, можно воспользоваться полем fields, и далее работать уже не с таблицей, а с хешем.

Пример

$tab[^table::create{menu   line

yes   first

no   second}

]

$tab_hash[$tab.fields]

$tab_hash.menu

$tab_hash.line


В результате будут выведены значения полей menu и line (имена которых совпадают с именами методов класса table) как значения ключей хеша tab_hash.



Tablejoin


join. Объединение двух таблиц


^таблица1.join[таблица2]

^таблица1.join[таблица2;опции]


Метод добавляет в конец таблицы1 записи из таблицы2. При этом из таблицы2 будет взято значение из столбца, одноименного столбцу таблицы1, или пустая строка, если такой столбец не найден.

Также можно задать ряд опций, контролирующих добавление, см. «Опции копирования».

Пример

^stuff.join[$just_hired_people]


Все записи таблицы $just_hired_people будут добавлены в таблицу $stuff.



Tableline


offset и line. Получение смещения указателя текущей строки


^таблица.offset[]


Метод offset без параметров возвращает текущее смещение указателя текущей строки от начала таблицы.

Пример

$men[^table::create{name

Вася

Петя

Сережа

}]

^men.menu{

    ^men.offset[] - $men.name

}[<br>]

Выдаст:

    0 - Вася 

    1 - Петя 

    2 - Сережа



Людям более привычно считать записи, начиная с единицы. Для удобного вывода нумерованных списков имеется метод line:

^таблица.line[]


Он позволяет сразу получить номер записи из таблицы в привычном виде, когда номер первой строки равен единице. Если в примере использовать ^men.line[], то нумерация будет идти от одного до трех.



Tableload


load. Загрузка таблицы с диска или HTTP-сервера


^table::load[имя файла] 

^table::load[имя файла;опции загрузки] 

^table::load[nameless;имя файла]

^table::load[nameless;имя файла;опции загрузки]

Конструктор создает объект, используя таблицу, определенную в некотором файле или документе на HTTP-сервере. Данные должны быть представлены в формате tab-delimited (см. table::create).

Имя файла - имя файла с путем или URL документа на HTTP-сервере.

Опции загрузки - об основных опция см. раздел «Работа с HTTP-серверами», также доступны дополнительные опции, см. «Опции формата файла».

Использование параметра nameless такое же, как и в конструкторе table::create.

Пример загрузки таблицы с диска

$loaded_table[^table::load[/addresses.cfg]]


Пример создает объект класса table, содержащий именованную таблицу, определенную в файле addresses.cfg, который находится в корневом каталоге веб-сайта.

Пример загрузки таблицы с HTTP-сервера

$table[^table::load[nameless;http://www.parser.ru/;

    $.USER-AGENT[table load example]

]]

Количество строк: ^table.count[]

<hr>

<pre>$table.0</pre>

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 01.04.2004



Tablelocate


locate. Поиск в таблице


^таблица.locate[столбец;искомое_значение]

^таблица.locate(логическое_выражение)

^таблица.locate[столбец;искомое_значение;опции]

^таблица.locate(логическое_выражение)[опции]


Метод ищет в указанном столбце значение, равное искомому и возвращает логическое значение «истина/ложь» в зависимости от успеха поиска. В случае если искомое значение найдено, строка, его содержащая, делается текущей. Если искомое значение найдено не было, указатель текущей строки не меняется.

Второй вариант вызова метода ищет первую запись, для которой истинно логическое выражение.

Также можно задать ряд опций, контролирующих поиск, см. «Опции поиска».

Поиске чувствителен к регистру букв.

Пример

$stuff[^table::create{name      pos   status

Александр   босс   1

Сергей     технолог   1

Тема       арт-директор   2

}]

^if(^stuff.locate[name;Тема]){

    Запись найдена в строке номер ^stuff.line[].<br>$stuff.name: $stuff.pos<br>

}{

    Запись не найдена

}


На экран будет выведено:

Запись найдена в строке номер 3.

Тема: арт-директор


Подставьте такой поиск в пример…

^stuff.locate($stuff.status>1)


…и будет найдена первая запись со статусом, большим 1.



Tablemenu


menu. Последовательный перебор всех строк таблицы


^таблица.menu{код}  

^таблица.menu{код}[разделитель]  

^таблица.menu{код}{разделитель}    


Метод menu выполняет код для каждой строки таблицы, последовательно перебирая все строки.

Разделитель - код, который вставляется после каждой непустой строки, кроме последней. Разделитель в квадратных скобках вычисляется один раз, в фигурных - много раз по ходу вызова.

Пример

$goods[^table::create{   pos   good      price

1   Монитор   1000

2   Системный блок   1500

3   Клавиатура   15}

]

<table border=1>

^goods.menu{

   <tr>

      <td>$goods.pos</td>

      <td>$goods.good</td>

      <td>$goods.price</td>

   </tr>

}

</table>


Пример выводит все содержимое таблицы $goods в виде HTML-таблицы.



Tableoffset


offset. Смещение указателя текущей строки


^таблица.offset(число)  

^таблица.offset[cur|set](число)


Смещает указатель текущей строки на указанное число вниз. Если аргумент метода отрицательный, то указатель перемещается вверх. Смещение указателя осуществляется циклически, то есть, достигнув последней строки таблицы, указатель возвращается на первую.

Необязательный параметр:

cur - смещает указатель относительно текущей строки

set - смещает указатель относительно первой строки

Пример

<table border="1">

^goods.offset(-1)

   <tr>

      <td>$goods.pos</td>

      <td>$goods.good</td>

      <td>$goods.price</td>

   </tr>

</table>


Результатом выполнения кода будет HTML-таблица, содержащая последнюю строку таблицы из предыдущего примера (метод menu).



Tableoptionsfmt


Опции формата файла   [3.1.2]


При загрузке и записи файла можно задать символы-разделители столбцов и символы, обрамляющие значения столбцов.

Опция

По-умолчанию

Описание

$.separator[символ]

табуляция

Задает символ, разделитель столбцов

$.encloser[символ]

нет

Задает символ, обрамляющий значение столбца.

Пример загрузки .txt файла, созданного Miscrosoft Excel

Excel умеет сохранять данные в простой текстовый файл, разделенный табуляциями:

   Файл|Сохранить как… Текст (Разделенный табуляциями) (.txt).

Данные сохраняются в следующем формате:

name

description

"ООО ""Петров и партнеры"""

Текст


(Значения ряда столбцов обрамляется кавычками, которые внутри самого значения удваиваются)

Чтобы считать такой файл, необходимо указать соответствующую опцию загрузки:

$companies[^table::load[companies.txt;

   $.encloser["]

]]

$companies.name


Parser также может работать и с .csv файлами, достаточно указать опцию:

   $.separator[^;]

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 01.04.2004



Tablesave


save. Сохранение таблицы в файл


^таблица.save[путь]

^таблица.save[путь;опции]   [3.1.2]

^таблица.save[nameless;путь]   

^таблица.save[nameless;путь;опции]   [3.1.2]

Сохраняет таблицу в текстовый файл в формате tab-delimited. Использование опции nameless сохраняет таблицу без имен столбцов.

Также доступны опции записи, см. «Опции формата файла», позволяющие, например, сохранить файл в .csv формате, для последующей загрузки данных в программы, которые понимают такой формат (Miscrosoft Excel).

Пример

^conf.save[/conf/old_conf.txt]


Таблица $conf будет сохранена в текстовом файле old_conf.txt в каталоге /conf/.

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 01.04.2004



Tableselect


select. Отбор записей


^таблица.select(критерий_отбора)


Метод последовательно перебирает все строки таблицы, применяя к ним выражение критерий_отбора, те строки, которые подпали под заданный критерий (логическое выражение было истинно), помещаются в результат, которым является таблица с такой же структурой, что и входная.

Пример

$men[^table::create{name   age

Serge   26

Alex   20

Mishka   29

}]

$thoseAbove20[^men.select($men.age>20)]

В $thoseAbove20 попадут строки с Serge и Mishka.




Tablesort


sort. Сортировка данных таблицы


^таблица.sort{функция сортировки_по_строке}

^таблица.sort{функция_сортировки_по_строке}[направление_сортировки]

^таблица.sort(функция сортировки_по_числу)

^таблица.sort(функция_сортировки_по_числу)[направление_сортировки]


Метод осуществляет сортировку таблицы по указанной функции.

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

Направление сортировки - параметр, задающий направление сортировки. Может быть:

desc - по убыванию

asc - по возрастанию

По умолчанию используется сортировка по возрастанию.

Пример

$men[^table::create{name   age

Serge   26

Alex   20

Mishka   29

}]

^men.sort{$men.name}

^men.menu{

    $men.name: $men.age

}[<br>]


В результате записи таблицы $men будут отсортированы по столбцу name (по строке имени):

    Alex: 20

    Mishka: 29 

    Serge: 26 


А можно отсортировать по столбцу age (по числу прожитых лет) по убыванию (desc), измените в примере вызов sort на такой…

^men.sort($men.age)[desc]


…получится…

    Mishka: 29

    Serge: 26

    Alex: 20



Tablesql


sql. Выборка таблицы из базы данных


^table::sql{SQL-запрос} 

^table::sql{SQL-запрос }[$.limit(n) $.offset(o)]


Конструктор создает объект класса table, содержащий таблицу, полученную в результате выборки из базы данных.

Для использования конструктора необходимо установленное соединение с сервером базы данных (см. оператор connect).

SQL-запрос - запрос на выборку из базы данных

Возможно использование дополнительных параметров конструктора:

$.limit(n) - получить не более n записей

$.offset(o) - отбросить первые O записей выборки

Пример

$sql_table[^table::sql{select * from news}]


В результате будет создан объект, содержащий все записи из таблицы news.

Примечание: всегда указывайте конкретный список необходимых вам полей.

Использование «*» крайне не рекомендуется, поскольку постороннему читателю (или вам самим через некоторое время) непонятно, что же за поля будут извлечены. Кроме того, так можно извлечь лишние поля (скажем, добавившиеся в ходе развития проекта), что повлечет ненужные расходы на их извлечение и хранение.



Tainting


Внешние и внутренние данные


Создавая код на Parser, мы имеем дело с двумя видами данных. Один из них - это все то, что написано самим кодером. Второй - данные, получаемые кодом извне, а именно из форм, переменных окружения, файлов и от SQL-серверов. Все то, что создано кодером, не нуждается в проверке на корректность. Вместе с тем, когда данные поступают, например, от пользователей через поля форм, выводить их «as-is» (как есть) может быть потенциально опасно. Возникает необходимость преобразования таких данных по определенным правилам. Большую часть работы по подобным преобразованиям Parser выполняет автоматически, не требуя вмешательства со стороны. Например, если присутствует вывод данных, введенных через поле формы, то в них символы < > автоматически будут заменены на &lt; и &gt;. Иногда наоборот бывает необходимо позволить вывод таких данных именно в том виде, в котором они поступили.

Для Parser «свой» код, т.е. тот, который набрал кодер, считается clean («чистым»). Все данные, которые поступают извне, считаются tainted («грязными» или «окрашенными»).

код Parser - этот код создан скриптовальщиком, поэтому никаких вопросов не вызывает;

$form:field - здесь должны быть выведены данные, введенные пользователем через форму;

$my_table[^table::sql{запрос}] - здесь данные поступают из БД.

В случае с $form:field, поступившие tainted данные будут автоматически преобразованы и некоторые символы заменятся в соответствии с внутренней таблицей замен Parser. После этого они станут clean («чистыми»), и их «окрашенность» исчезнет. Здесь неявно выполняется операция untaint (снять «окраску»). Автоматическое преобразование данных происходит в тот момент, когда эти данные будут выводиться. Так, в случае с помещением данных, поступивших из БД, в переменную $my_table, преобразование выполнится в тот момент, когда данные будут в каком-либо виде выданы во внешнюю среду (переданы браузеру, сохранены в файл или базу данных).

Вместе с тем, бывают ситуации, когда необходимости в таком преобразовании нет, либо данные нужно преобразовать по другим правилам, чем это делает Parser по умолчанию. Например, нам нужно разрешить пользователю вводить HTML-теги через поле формы для дополнительного форматирования текста. Но, так как это чревато неприятностями (ввод Java-скрипта в гостевой книге может перенаправлять пользователей с вашего сайта на вражеский), Parser сам заменит «нежелательные» символы в соответствии со своими правилами. Решение - использование оператора untaint.

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 05.12.2003



Vars


Переменные


Переменные могут хранить данные следующих типов:

·строка (string);  

·число (int/double);  

·истина/ложь;  

·хеш (ассоциативный массив);  

·класс объектов;  

·объект класса (в т.ч. пользовательского);  

·код;  

·выражение.  


Для использования переменных не требуется их заранее объявлять.

В зависимости от того, что будет содержать переменная, для присвоения ей значения используются различные типы скобок:

$имя_переменной[строка]

переменной присваивается строковое значение (объект класса string) или произвольный объект некоторого класса

$имя_переменной(выражение)

переменной присваивается число или результат математического выражения

$имя_переменной{код}

переменной присваивается фрагмент кода, который будет выполнен при обращении к переменной

Для получения значения переменных используется обращение к имени переменной:

$имя_переменной - получение значения переменной

Примеры

Код

Результат

$string[2+2]

$string

2+2

$number(2*2)

$number


4


$i(0)

$code{$i}

$i(1)

$code


1

$i(0)

$string[$i]

$i(1)

$string

0


В качестве части имени может быть использовано…

…значение другой переменной:

$superman[value of superman variable]

$part[man]

$super$part

Возвратит: value of superman variable


$name[picture]

${name}.gif

Возвратит строку picture.gif, а не значение поля gif объекта picture.

…результат работы кода:

$field.[b^eval(2+3)]

Возвратит значение поля b5 объекта field.



Voidclass


Класс void


Класс предназначен для работы с «пустыми» объектами. Он не имеет конструкторов, объекты этого класса создаются автоматически, например, когда вы обращаетесь к несуществующей переменной.

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 03.12.2002



Voidintdouble


int, double


^объект.int[]  

^объект.int(значение по умолчанию)  

^объект.double[]  

^объект.double(значение по умолчанию)

В случае отсутствия объекта эти методы выдают либо 0, либо значение по умолчанию. Эти методы работают, когда выполняется преобразование к int/double не определенных заранее объектов, скажем, полей форм (см. класс form).

Пример

^form:number.int[]


Если поле number определено, то есть было передано, его значение просто преобразуется к классу int. Если же это поле не определено, то есть его просто нет, несуществующее значение, относящееся к классу void, приравняется к 0, и ничего страшного не произойдет - код будет выполняться дальше.



Voidlength


length. Длина «строки»


^объект.length[]   

В случае отсутствия объекта этот метод выдает 0.

Пример

^if(^form:password.length[]<$MIN_PASSWORD_LENGTH){

    Длина введенного пароля меньше $MIN_PASSWORD_LENGTH

}


Если поле password определено, то есть было передано, вычислится его длина, и будет проверена. Это обычный вызов метода ^строка.length[]. Если же это поле не определено, то есть его просто нет, длина несуществующего значения, относящегося к классу void, считается равным 0, и ничего страшного не произойдет - эта длина будет успешно проверена.



Voidltrtmid


left, right, mid. Получение подстроки   [3.1.2]


^строка.left(N)  

^строка.right(N)   

^строка.mid(P;N)

^строка.mid(P)


В случае отсутствия объекта эти методы выдают пустую подстроку.

Пример

^form:email.left(50)


Если поле email определено, то есть было передано - это обычный вызов метода ^строка.left[]. Если же это поле не определено, то есть его просто нет, считается что в несуществующем значении, относящемся к классу void, никакие подстроки не существуют, и ничего страшного не произойдет - будет успешно выдана пустая строка.

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 01.04.2004



Voidpos


pos. Получение позиции подстроки


^объект.pos[подстрока]   

В случае отсутствия объекта этот метод выдает -1.

Пример

^if(^form:email.pos[@]>0){

    Может быть…

}


Если поле email определено, то есть было передано - это обычный вызов метода ^строка.pos[]. Если же это поле не определено, то есть его просто нет, считается что в несуществующем значении, относящемся к классу void, никакие подстроки не существуют, и ничего страшного не произойдет - будет успешно выполнена проверка.



Voidsql


sql. Запрос к БД, не возвращающий результат


^void:sql{SQL-запрос}   

Осуществляет выполнение SQL-запроса, который не возвращает результат (операции по управлению данными в базе данных).

Для работы этого метода необходимо установленное соединение с сервером базы данных (см. оператор connect).

Пример

^connect[строка подключения]{

   ^void:sql{create table users(id int,name text,email text)}

}


В результате выполнения этого кода в базе данных будет создана таблица users, при этом запрос не вернет никакого результата. Пример дан для СУБД MySQL.



Xdocclass


Класс xdoc


Класс предназначен для работы с древовидными структурами данных в паре с xnode, и поддерживает считывание файлов в XML формате и запись в XML (http://www.w3.org/XML) и HTML, а также XSLT (http://www.w3.org/TR/xslt) трансформацию.

Работа с деревом производится в DOM-модели (http://www.w3.org/DOM), доступен DOM1 и ряд возможностей DOM2.

Класс реализует DOM-интерфейс Document и является наследником класса xnode.

Ошибки DOM-операций (интерфейс DOMException) преобразуются в исключения xml-типа.

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 16.02.2004



Xdoccreateempty


create. Создание нового пустого документа


^xdoc::create[имя_тега]

^xdoc::create[базовый_путь;имя_тега]

Конструктор создает объект класса xdoc, состоящий из единственного тега имя_тега. Возможно задание Базового пути.


Пример

$document[^xdoc::create[document]]

$paraNode[^document.createElement[para]]

$addedNode[^document.documentElement.appendChild[$paraNode]]

$response:body[^document.string[]]



Xdoccreatexml


create. Создание документа на основе заданного XML


^xdoc::create{XML-код}

^xdoc::create[базовый_путь]{XML-код}

Конструктор создает объект класса xdoc из XML-кода. Возможно задание базового пути.


Пример

$document[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>

<document>

текст

</document>}]

$response:body[^document.string[]]




Xdocdomfields


DOM


DOM1-интерфейс Document:

$DocumentType[$документ.doctype]

$Element[$документ.documentElement]



В Parser DOM-интерфейсы Node и Element и их производные реализованы в классе xnode.

Подробная спецификация DOM1 доступна здесь: http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html


Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 22.09.2003



Xdocdommethods


DOM


DOM1-интерфейс Document:


$Element[^документ.createElement[tagName]]

$DocumentFragment[^документ.createDocumentFragment[]]

$Text[^документ.createTextNode[data]]

$Comment[^документ.createComment[data]]

$CDATASection[^документ.createCDATASection[data]]

$ProcessingInstruction[^документ.createProcessingInstruction[target;data]]

$Attr[^документ.createAttribute[name]]

$EntityReference[^документ.createEntityReference[name]]

$NodeList[^документ.getElementsByTagName[tagname]]

DOM2-интерфейс Document:

$Node[^документ.importNode[importedNode](deep)]

$Element[^документ.createElementNS[namespaceURI;qualifiedName]]  [3.1.1]

$Attr[^документ.createAttributeNS[namespaceURI;qualifiedName]]  [3.1.1]

$NodeList[^документ.getElementsByTagNameNS[namespaceURI;localName]]

$Element[^документ.getElementById[elementId]]

В Parser

·DOM-интерфейсы Node и Element и их производные реализованы в классе xnode;  

·DOM-интерфейс NodeList - класс hash с ключами 0, 1, …;  

·DOM-тип DOMString - класс string;  

·DOM-тип boolean - логическое значение: 0=ложь, 1=истина.  


Подробная спецификация DOM1 доступна здесь: http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html


Подробная спецификация DOM2 доступна здесь: http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html


Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 18.02.2004



Xdocfile


file. Преобразование документа к объекту класса file


^документ.file[Параметры_преобразования_в_текст]

Преобразует документ к типу file. Возможно задание параметров_преобразования в текст.

По умолчанию создается XML-представление документа с заголовком <?xml … ?> (можно отключить вывод заголовка, задав соответствующий параметр).

Пример

$document[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>

<document>

строка1<br/>

строка2<br/>

</document>}]

$response:body[^document.file[]]



Xdocload


load. Загрузка XML с диска, HTTP-сервера или иного источника


^xdoc::load[имя файла]

Конструктор загружает XML-код из некоторого файла или адреса на HTTP-сервере и создает на его основе объект класса xdoc.

Parser может считать XML из произвольного источника, см. раздел «Чтение XML из произвольного источника».

имя файла - имя файла с путем или URL файла на HTTP-сервере.

Пример загрузки XML-документа с диска

$document[^xdoc::load[article.xml]]

$response:body[^document.string[]]


Пример загрузки XML-документа с HTTP-сервера

$xdoc[^xdoc::load[http://www.cbr.ru/scripts/XML_daily.asp]]

На

    ^xdoc.selectString[string(/ValCurs/@Date)]

курс валюты

    $node[^xdoc.selectSingle[/ValCurs/Valute[CharCode='USD']]]

    "^node.selectString[string(Name)]"

равен

    ^node.selectString[string(Value)]

<hr>

<pre>^taint[^xdoc.string[]]</pre>

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 14.05.2004



Xdocoptions


Параметры преобразования документа в текст


В ряде методов можно задать хеш Параметры_преобразования_в_текст.

Они идентичны атрибутам элемента <xsl:output … />.

Исключением являются атрибуты doctype-public и doctype-system, которые так задать нельзя.

Пока также является исключением cdata-section-elements.

По умолчанию текст создается в кодировке $request:charset, однако в XML заголовке или в элементе meta для HTML-метода Parser указывает кодировку $response:charset. Такое поведение можно изменить, явно указав кодировку в <xsl:output … /> или соответствующем параметре преобразования.   [3.1.2]

При создании объекта класса file можно задать параметр media-type, при задании нового тела ответа заголовок ответа content-type получит значение этого параметра.

Пример

# выдаст документ в HTML-представлении без отступов

^document.string[

    $.method[html]

    $.indent[no]

]

Выдача XHTML

Если необходимо выдать XHTML, следует использовать такие атрибуты элемента <xsl:stylesheet … />:

<xsl:stylesheet version="1.0"

   xmlns="http://www.w3.org/1999/xhtml"

   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

>


Обратите внимание на указание xmlns без префикса - так необходимо делать, чтобы все создаваемые в шаблоне элементы без префикса попадали в пространство имен xhtml. Необходимо задавать xmlns без префикса в каждом .xsl файле, этот параметр не распространяется на включаемые файлы.

А также необходимо задать такие атрибуты <xsl:output … />:

<xsl:output 

   doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"

   doctype-system="DTD/xhtml1-strict.dtd"

   />


Внимание: не задавайте атрибут method. XHTML это разновидность метода xml, включающаяся при использовании следующих doctype:

   -//W3C//DTD XHTML 1.0 Strict//EN

   -//W3C//DTD XHTML 1.0 Frameset//EN

   -//W3C//DTD XHTML 1.0 Transitional//EN


Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 01.04.2004



Xdocparserprot


parser://метод/параметр. Чтение XML из произвольного источника   [3.1.2]


Parser может считать XML из произвольного источника.

Везде, где можно считать XML, можно задать адрес документа вида…

parser://метод/параметр

Считывание документа по такому адресу приводит чтению результата работы метода Parser, ^метод[/параметр].

Пример хранения XSL шаблонов в базе данных

@main[]


# к этому моменту в $xdoc находится документ, который хотим преобразовать

^xdoc.transform[parser://xsl_database/main.xsl]

@xsl_database[name]

^string:sql{select text from xsl where name='$name'}

Причем относительные ссылки будут обработаны точно также, как если бы файлы читались с диска.

Скажем, если parser://xsl_database/main.xsl ссылается на utils/common.xsl, будет загружен документ

parser://xsl_database/utils/common.xsl, для чего будет вызван метод ^xsl_database[/utils/common.xsl].

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 01.04.2004



Xdocsave


save. Сохранение документа в файл


^документ.save[путь]

^документ.save[путь;Параметры_преобразования_в_текст]


Сохраняет документ в текстовый файл. Возможно задание параметров_преобразования в текст.

По умолчанию создается XML-представление документа с заголовком <?xml … ?> (можно отключить вывод заголовка, задав соответствующий параметр).

Путь - путь к файлу.

Пример

$document[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>

<document>

строка1<br/>

строка2<br/>

</document>}]

^document.save[saved.xml]



Xdocsearchns


search-namespaces. Хеш пространств имен для поиска   [3.1.2]


$документ.search-namespaces

Для использования префиксов пространств имен в методах xnode.select* необходимо заранее эти префиксы определить в данном хеше.

Здесь

·ключи - префиксы пространств имен,  

·значения - их URI.  


Пример

$xdoc[^xdoc::create{<?xml version="1.0"?>

<document xmlns:s="urn:special">

   <s:code>string</s:code>

</document>

}]

$xdoc.search-namespaces.s[urn:special]

^xdoc.selectString[string(//s:code)]




Xdocstring


string. Преобразование документа в строку


^документ.string[]

^документ.string[Параметры_преобразования_в_текст]


Преобразует документ в текстовую форму. Возможно задание параметров_преобразования.

По умолчанию создается XML-представление документа с заголовком <?xml … ?> (можно отключить вывод заголовка, задав соответствующий параметр).

Пример

$document[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>

<document>

строка1<br/>

строка2<br/>

</document>}]

^document.string[

    $.method[html]

]



Xdoctransform


transform. XSL преобразование


^документ.transform[шаблон]

^документ.transform[шаблон][XSLT-параметры]


Осуществляет XSL-преобразование документа по шаблону. Возможно задание XSLT-параметров.

Шаблон - или путь_к_файлу_с_шаблоном, или xdoc документ.

Parser может считать XML из произвольного источника, см. раздел «Чтение XML из произвольного источника».


XSLT-параметры - хеш строк, доступных из шаблона через <xsl:param … />.

Внимание: Parser (в виде модуля к Apache или IIS) кеширует результат компиляции файла_с_шаблоном во внутреннюю форму, повторная компиляция не производится, а скомпилированный шаблон берется из кеша. Вариант CGI также кеширует шаблон, но только на один запрос. Шаблон перекомпилируется при изменении даты файлов шаблона.

Пример (см. также «Урок 6. Работаем с XML»)

# входной xdoc документ

$sourceDoc[^xdoc::load[article.xml]]

# преобразование xdoc документа шаблоном article.xsl

$transformedDoc[^sourceDoc.transform[article.xsl]]

# выдача результата в HTML виде

^transformedDoc.string[

    $.method[html]

]


Если шаблон не считывается с диска, а создается динамически, важным вопросом становится «а откуда загрузятся <xsl:import href="some.xsl"/>?», обратите внимание на возможность задания базового пути: «Параметр создания нового документа: Базовый путь».

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 28.05.2004



Xdocuriparam


Параметр создания нового документа: Базовый путь


В конструкторах нового документа можно задать Базовый путь.

По действию он аналогичен заданию атрибута

<…

    xmlns:xml="http://www.w3.org/XML/1998/namespace"

    xml:base="базовый URI" …


Отличаясь тем, что пути задаются стандартным для Parser способом (см. «Приложение 1. Пути к файлам и каталогам»), что куда удобнее задания полного дискового пути, включающего путь к веб-пространству. По умолчанию равен пути к текущему обрабатываемому документу.

Внимание: символ «/» на конце пути обязателен.

Пример

$sheet[^xdoc::create[/xsl/]{<?xml version="1.0" encoding="$request:charset"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:import href="import.xsl"/>

</xsl:stylesheet>

}]


Здесь файл import.xsl, будет считан из каталога /xsl/.




Xnodeclass


Класс xnode


Класс предназначен для работы с древовидными структурами данных в паре с xdoc, поддерживает XPath (http://www.w3.org/TR/xpath) запросы.

Класс реализует DOM-интерфейсы Node и Element и их производные.

Класс напрямую не создается, используются соответствующие методы класса xdoc.

Вместо DOM-интерфейса NamedNodeMap в Parser используется класс hash.

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 16.02.2004



Xnodedomfields


DOM


DOM1-интерфейс Node:

$узел.nodeName

$узел.nodeValue

$узел.nodeValue[новое значение]   [3.1.2]

^if($узел.nodeType == $xnode:ELEMENT_NODE){…}

$Node[$узел.parentNode]

$NodeList[$узел.childNodes]

$Node[$узел.firstChild]

$Node[$узел.lastChild]

$Node[$узел.previousSibling]

$Node[$узел.nextSibling]

$NodeList[$узел_типа_ELEMENT.attributes]

$Document[$node.ownerDocument]


DOM1-интерфейс Element:

$узел_типа_ELEMENT.tagName

DOM1-интерфейс Attr:


$узел_типа_ATTRIBUTE.name

^if($узел_типа_ATTRIBUTE.specified){…}

$узел_типа_ATTRIBUTE.value

DOM1-интерфейс ProcessingInstruction:

$узел_типа_PROCESSING_INSTRUCTION.target

$узел_типа_PROCESSING_INSTRUCTION.data


DOM1-интерфейс DocumentType:

$узел_типа_DOCUMENT_TYPE.name

$узел_типа_DOCUMENT_TYPE.entities

$узел_типа_DOCUMENT_TYPE.notations


DOM1-интерфейс Notation:

$узел_типа_NOTATION.publicId

$узел_типа_NOTATION.systemId



В Parser

·DOM-интерфейс NodeList - класс hash с ключами 0, 1, …;  

·DOM-тип DOMString - класс string;  

·DOM-тип boolean - логическое значение: 0=ложь, 1=истина.  


Подробная спецификация DOM1 доступна здесь: http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html


Подробная спецификация DOM2 доступна здесь: http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html

Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 01.04.2004



Xnodedommethods


DOM1.


DOM1-интерфейс Node:

$Node[^узел.insertBefore[$newChild;$refChild]]

$Node[^узел.replaceChild[$newChild;$oldChild]]

$Node[^узел.removeChild[$oldChild]]

$Node[^узел.appendChild[$newChild]]

^if(^узел.hasChildNodes[]){…}

$Node[^узел.cloneNode(deep)]


DOM1-интерфейс Element:

^узел.getAttribute[name]

^узел.setAttribute[name;value]

^узел.removeAttribute[name]

$Attr[^узел.getAttributeNode[name]]

$Attr[^узел.setAttributeNode[$newAttr]]

$Attr[^узел.removeAttributeNode[$oldAttr]]

$NodeList[^узел.getElementsByTagName[name]]

^узел.normalize[]

DOM2-интерфейс Element:

$строка[^узел.getAttributeNS[namespaceURI;localName]]   [3.1.1]

^узел.setAttributeNS[namespaceURI;localName;value]   [3.1.1]

^узел.removeAttributeNS[namespaceURI;localName]   [3.1.1]

$Attr[^узел.getAttributeNodeNS[namespaceURI;localName]]   [3.1.1]

$Attr[^узел.setAttributeNodeNS[$newAttr]]   [3.1.1]

$NodeList[^узел.getElementsByTagNameNS[namespaceURI;localName]]

^if(^узел.hasAttribute[name]){…}   [3.1.1]

^if(^узел.hasAttributeNS[namespaceURI;localName]){…}   [3.1.1]



В Parser

·DOM-интерфейс NodeList - класс hash с ключами 0, 1, …;  

·DOM-тип DOMString - класс string;  

·DOM-тип boolean - логическое значение: 0=ложь, 1=истина.  


Подробная спецификация DOM1 доступна здесь: http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html


Подробная спецификация DOM2 доступна здесь: http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html


Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 16.02.2004



Xnodeselect


select. XPath поиск узлов


$NodeList[^узел.select[XPath-запрос]]

Выдает список узлов, найденных в контексте узла по заданному XPath-запросу. Если запрос не вернул подходящих узлов, выдается пустой список.

Для использования в запросе префиксов пространств имен необходимо их заранее определить, см. $xdoc.search-namespaces.

Пример

$d[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>

<document>

    <t/><t/>

</document>}]

# результат=список из двух элементов "t"

$list[^d.select[/document/t]]

# перебираем найденные листы:

#   этот код будет работать

#   даже если запрос не найдет ни одного листа 

^for[i](0;$list-1){

    $node[$list.$i]

    Имя: $node.nodeName<br>

    Тип: $node.nodeType<br>

}


В Parser DOM-интерфейс NodeList - класс hash с ключами 0, 1, …

Подробная спецификация XPath доступна здесь: http://www.w3.org/TR/xpath



Xnodeselectbool


selectBool. Вычисление логического XPath запроса


^узел.selectBool[XPath-запрос]

Выдает результат выполнения XPath-запроса в контексте узла, если это логическое значение. Если не логическое значение, выдается ошибка типа parser.runtime.


Для использования в запросе префиксов пространств имен необходимо их заранее определить, см. $xdoc.search-namespaces.

Пример

$d[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>

<t attr="привет" n="123"/>}]

^if(^d.selectBool[/t/@n > 10]){

    /t/@n больше 10

}{

    не больше

}


Подробная спецификация XPath доступна здесь: http://www.w3.org/TR/xpath



Xnodeselectnumber


selectNumber. Вычисление числового XPath запроса


^узел.selectNumber[XPath-запрос]

Выдает результат выполнения XPath-запроса в контексте узла, если это число. Если не число, выдается ошибка типа parser.runtime.

Для использования в запросе префиксов пространств имен необходимо их заранее определить, см. $xdoc.search-namespaces.

Пример

$d[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>

<t attr="привет" n="123"/>}]

#результат=124

^d.selectNumber[number(/t/@n)+1]<br>

#результат=4

^d.selectNumber[2*2]<br>


Подробная спецификация XPath доступна здесь: http://www.w3.org/TR/xpath



Xnodeselectsingle


selectSingle. XPath поиск одного узла


^узел.selectSingle[XPath-запрос]

Выдает узел, найденный в контексте узла по заданному XPath-запросу. Если запрос не нашел подходящего узла, выдается void. Если запрос выдал больше, чем один узел, выдается ошибка xml-типа.

Для использования в запросе префиксов пространств имен необходимо их заранее определить, см. $xdoc.search-namespaces.

Пример

$d[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>

<t attr="привет" n="123"/>}]

# результат=один элемент "t"

$element[^d.selectSingle[t]]

# результат=2 (количество атрибутов <t>)

Количество атрибутов: ^element.attributes._count[]<br>


Подробная спецификация XPath доступна здесь: http://www.w3.org/TR/xpath



Xnodeselectstring


selectString. Вычисление строчного XPath запроса


^узел.selectString[XPath-запрос]

Выдает результат выполнения XPath-запроса в контексте узла, если это строка. Если не строка, выдается ошибка типа parser.runtime.


Для использования в запросе префиксов пространств имен необходимо их заранее определить, см. $xdoc.search-namespaces.

Пример

$d[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>

<t attr="привет" n="123"/>}]

# результат=привет

^d.selectString[string(t/@attr)]


Подробная спецификация XPath доступна здесь: http://www.w3.org/TR/xpath