/A> Язык запросов
Тесная интегрированность SXPath с языком программирования общего назначения Scheme предоставляет функциональность языка запросов к SXML-документам.
Проводя аналогии с языком запросов к XML-документам XQuery, можно обозначить следующие соответствия между конструкциями XQuery и возможностями Scheme:
- Итерация по членам последовательности for-return языка XQuery реализуется на Scheme функцией map. Функция map получает на вход функцию от одного аргумента и список, формируя новый список, последовательно применяя полученную в качестве аргумента функцию к каждому из членов аргумента-списка.
- Функции и операторы XQuery[11], а также функции XQuery, определяемые пользователем, реализуются на Scheme также функциями - стандартными, библиотечными или определяемыми пользователем. Дополнительно в языке Scheme функции могут использоваться как объекты первого класса, что не поддерживается в XQuery.
- Конструкторы различных типов узлов в языке XQuery реализуются на Scheme конструкторами списков. Более того, наличие в языке Scheme выражений квази-цитирования (quasiquote) и снятия цитирования (unquote) позволяет компактным и наглядным образом комбинировать константные выражения и фрагменты вычисляемых выражений. Аналогичные идеи используются в синтаксисе XSLT для комбинирования литеральных элементов результата [2] и исполняемых инструкций.
Рассмотрим совместное использование SXPath и Scheme как языка запросов к SXML-документам на конкретном примере.
Пример 8. Вновь обратимся к рисунку 1 и подведем счет для каждого сделанного заказа. Счет будет включать в себя имя клиента и общую цену с учетом количества единиц каждого заказанного товара.
Получение желаемого результата требует использования языка запросов, поскольку требуется не просто выбрать некоторые узлы из XML-документов, но также сконструировать новые узлы, которых в самих документах нет. На рис. 6 показано решение поставленного запроса в двух вариантах:
- на языке XQuery, расширенном предлагаемыми в настоящей статье дополнительными осями XPath;
- на Scheme, благодаря тесной интеграции SXPath с языком программирования.
Рис. 6: Вычисление счета для каждого заказа: с помощью XQuery, расширенного поддержкой XLink, (вверху) и с помощью Scheme (внизу). См. также пример 8.
Из рис. 6 легко видеть, что соответствие между выражениями языка XQuery и вызовами функций языка Scheme является достаточно прямолинейным, и многие конструкции языка XQuery имеют свое наглядное отражение в виде примитивов языка Scheme над деревьями SXML-документов.
Результатом вычисления представленного на рис. 6 кода на Scheme является набор узлов, выражающих на SXML искомые счета для сделанных заказов: ((bill (total-price 1900) (name "John Smith")) (bill (total-price 20) (name "Paul Brown")))