Классика баз данных - статьи

       

Рассмотрим оба этих аспекта более


Рассмотрим оба этих аспекта более детально. Имеет смысл рассмотреть возникающие проблемы для двух случаев. В первом случае требуется вычислить запрос над данными, структура которых не известна. Такая ситуация часто возникает при работе с XML-документами, ориентированными на данные (document-oriented XML data) []. Во втором случае структура данных может быть известной и сложной, что характерно для XML-документов, ориентированных на данные (data-oriented XML documents) [].
Рассмотрим проблемы, связанные с выразительностью запросов на языке XQuery, на следующем примере, характерным для задач управления контентом (content management). Предположим, что имеется база XML-данных, содержащая обзоры кинофильмов. Каждый обзор представляет собой текст, в котором некоторые слова или выражения обрамлены XML-тэгами с некоторыми атрибутами. Например, имя режиссера заключено в тэг <director id="3">. Такая встроенная разметка (in-line markup) часто используется для того, чтобы внести структуру фрагментов текстовых данных и приписать им семантику. В дальнейшем эта разметка может быть использована при генерации различных представлений данных для публикации.
Предположим, что требуется сгенерировать XHTML-представление обзора, в котором имена режиссеров должны стать гиперссылками, то есть таким образом, чтобы встречающиеся в тексте имена режиссера были заменены в HTML-представлении гиперссылками на страницы, содержащие информацию об этом режиссере. Пусть информация о ссылках хранится отдельно, например, в другом документе базы XML-данных.
Если структура данных не известна, мы не можем заранее сказать, в каких именно узлах встречается элемент director. Тогда единственным методом решения задачи является использование рекурсивной функции, обходящей узлы документа и формирующей результат в зависимости от имени и типа текущего узла. Примерный вариант запроса с рекурсивной функцией обхода XML-дерева на языке XQuery будет выглядеть следующим образом.
declare function replace($n as xs:node) as xs:node { typeswitch($n) case $emph as element(emphasis) return element i {$emph/node()} case $e as element() return element { fn:localname($e) } { for $c in $e/(* | @*) return local:swizzle($c) } case $d as documentnode() return document { for $c in $d/* return local:swizzle($c) } default return $n };

Содержание  Назад  Вперед