Язык модификации данных формата XML функциональными методами


4. Переименование узла


Операция переименования узла изменяет имя узла и оставляет неизменным его содержимое.

Операция переименования осмысленна для узлов, которые обладают именами, т.е. для элементов и атрибутов. При обработке XML-данных на языке Scheme элементы и атрибуты выражаются в виде S-выражений единообразным образом, и имя всегда является первым членом S-выражения, соответствующего данному элементу или атрибуту.

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

(define (rename new-name) (lambda (node) (if (pair? node) ; именованный узел (cons new-name (cdr node)) node)))

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

Приведенное тело обработчика может быть легко дополнено функциональностью, позволяющей для узла типа “инструкция обработки” переименовывать ее указание адреса (PI target)[], что сделает семантику рассматриваемой операции переименования узла полностью совместимой с [].

Пример 4  

Переименование узла в терминах языка модификаций [] записывается в виде:

UPDATE RENAME //job[.='bit banger'] AS "profession"

С использованием предлагаемой идеи обработчиков, эквивалентный запрос на модификацию может быть записан на Scheme так:

(sxml:modify `("//job[.='bit banger']" ,(rename 'profession)))

Здесь 'profession имеет тип данных символ, и этот тип данных используется в SXML для представления имен элементов и атрибутов.




Начало  Назад  Вперед



Книжный магазин