Язык XML. Язык запросов X-Query

Автор работы: Пользователь скрыл имя, 12 Мая 2013 в 20:28, реферат

Описание работы

XML (Extensible Markup Language) - это новый SGML-производный язык разметки документов, позволяющий структурировать информацию разного типа, используя для этого произвольный набор инструкций.
XML предназначен для хранения структурированных данных (взамен существующих файлов баз данных), для обмена информацией между программами, а также для создания на его основе более специализированных языков разметки (например, XHTML), иногда называемых словарями. XML является упрощённым подмножеством языка SGML.

Файлы: 1 файл

Реферат на тему- Язык xml. Язык запросов X query.doc

— 489.50 Кб (Скачать файл)

<highbid status = «{$s}»>

  <itemno>{$i}</itemno>

  <bid-amount>

     {max($bids[itemno = $i]/bid-amount)}

</bid-amount>

</highbid>

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

<highbid>

  {

         $b/@status

         $b/itemno

         $b/bid-amount

  }

</highbid>

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

В приведенных примерах конструкторов  элементов, хотя содержимое элементов  может быть вычисляемым, имя конструируемого элемента — известная константа. Однако иногда необходимо сконструировать элемент, имя которого, как и его содержимое, вычисляется. Для этого в XQuery определяется специальный вид конструктора, называемого вычисляемым конструктором элемента (computed element constructor). Он состоит из ключевого слова element, за которым следуют два выражения в фигурных скобках — первое вычисляет имя элемента, а второе — его содержимое.

Чтобы привести пример использования  вычисляемого конструктора, предположим, что переменная $e связана с элементом, имеющим числовое значение. Нам нужно сконструировать новый элемент, имеющий то же имя, что и $e, и те же атрибуты, что у $e, но его значение должно быть вдвое больше значения $e. Этого можно добиться с помощью выражения, в котором функция data используется для получения числового значения исходного узла.

element

    {name($e)}

    {$e/@*, data($e)*2}

Подобно вычисляемому конструктору элемента, в XQuery обеспечивается вычисляемый конструктор  атрибута (computed attribute constructor), состоит из ключевого слова attribute, за которым следуют два выражения в фигурных скобках — первое вычисляет имя атрибута, а второе — значение. Конструктор атрибута может использоваться везде, где допустим атрибут. Следующий конструктор атрибута на основе связанной переменной $p мог бы сгенерировать атрибут, который выглядит как father = «Frank» или mother = «Mary».

attribute

   {if $p/sex = "M" then "father" else "mother"}

   {$p/name}

Итерация и сортировка

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

В наиболее простой форме итерация в XQuery задается оператором for, в котором указывается имя переменной и предоставляется последовательность значений, над которой переменная итерируется. Далее указывается оператор return, который содержит выражение, вычисляемое для каждого связывания переменной; см. ниже.

for $n in (2, 3) return $n + 1

Результатом этого итеративного выражения  будет последовательность (3, 4).

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

for $m in (2, 3), $n in (5, 10)

return <fact>{$m} times {$n} is

{$m * $n} </fact>

В результате получается следующая последовательность из четырех элементов.

<fact>2 times 5 is 10 </fact>

<fact>2 times 10 is 20 </fact>

<fact>3 times 5 is 15 </fact>

<fact>3 times 10 is 30</fact> 

Операторы for и let — частные случаи более общего выражения, называемого FLWR. В наболее общем виде выражение FLWR может иметь несколько операторов for, несколько операторов let, необязательный оператор where, а также оператор return. Функция операторов for и let — связывание переменных. Каждый из них содержит одну или несколько переменных и выражение, присваиваемое каждой переменной. Результатом вычисления выражений являются последовательности, и выражения могут содержать ссылки на переменные, для которых связывание было выполнено в предыдущих операторах. Оператор for итерирует каждую переменную над ассоциированной с ней последовательностью, связывая переменную по очереди с каждым объектом последовательности, а как оператор let связывает каждую переменную сразу со всей ассоциированной последовательностью. Это различие иллюстрируется следующей парой операторов.

for $i in (1 to 3)

let $j := (1 to $i)

Эта пара операторов не является полным выражением FLWR, поскольку в нем  отсутствует условие return. Операторы for и let просто порождают последовательность кортежей связываний. Приведенный выше пример порождает следующую последовательность из трех пар связываний.

$i = 1, $j = 1

$i = 2, $j = (1,2)

$i = 3, $j = (1,2,3)

В общем случае, число кортежей связывания, порождаемых серией операторов for и let, равняется произведению мощностей  выражений итерации в операторах for. Оператор let при отсутствии оператора for, конечно, порождает только один кортеж связывания.

Кортежи связывания, порожденные операторами for и let в FLWR-выражении, фильтруются в  соответствии с необязательным условием where. Оператор where содержит выражение, которое вычисляется для каждого кортежа связывания. Если значением выражения where являются булевское значение true или непустая последовательность («проверка существования»), то кортеж связываний принимается; в противном случае он отвергается.

Затем в выражении FLWR вычисляется  оператор return по очереди и по одному разу для каждого оставшегося  после проверки условия where кортежа  связывания. Результаты вычислений объединяется в последовательность, которая и  является результатом выражения FLWR.

 

Возможности FLWR иллюстрируются в запросе  к базе данных аукциона Q4.

(Q4) Для каждого товара, который  имеет более десяти ставок, создать  элемент popular-item, содержащий номер  товара, описание и число ставок.

for $i in document("items.xml")/*/item

let $b := document("bids.xml")

  /*/ bid[itemno = $i/itemno]

where count ($b) > 10

return

<popular-item>

    {

    $i/itemno,

    $i/description,

    <bid-count> {count($b)} </ bid-count>

    }

</popular-item>

Операторы for и let порождают пару связывания для каждого item в items.xml. В каждой паре связывания $i связан с товаром, а $b — с последовательностью, содержащей все ставки для этого товара. Оператор where оставляет только те связанные кортежи, в которых $b содержит более десяти ставок. Затем оператор return для каждого из этих связываний генерирует выходной элемент, содержащий номер товара, описание и число ставок.

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

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

Условие sortby часто полезно для  переупорядочивания результатов выражения FLWR. Если необходимо отсортировать  по убыванию bid-count элементы popular-item, сгенерированные  в запросе Q4, то в конец Q4 можно  добавить следующий оператор.

sortby bid-count descending

Важно понимать, что sortby не является частью выражения FLWR, а представляет собой  отдельный вид выражений XQuery, который  может использоваться для переупорядочивания любой последовательности, вне зависимости  от того, сгенерирована она выражением FLWR или нет. Однако если после выражения FLWR стоит sortby, интеллектуальный оптимизатор поймет, что переупорядочивание выходных объектов снимает обычные ограничения на порядок кортежей связываний.

Q4 показывает, как выражение FLWR может походить на запрос с соединением в системе управления реляционной базой данных, а также на запрос с группировкой. Q4 похож на запрос с соединением, поскольку в нем коррелируются элементы, находящиеся в двух разных файлах — items.xml и bids.xml. Он также напоминает запрос с группировкой, поскольку ставки группируются по номеру товара, и вычисляется число ставок в каждой группе.

Арифметические операции

В XQuery обеспечиваются обычные арифметические операции: +, — , *, div и mod, а также агрегатные функции sum, avg, count, max и min, которые применяются к последовательности чисел и возвращают числовой результат. Оператор деления в XQuery называется div, чтобы его можно было отличить от слэша. Если после оператора вычитания следует имя, перед ним должен стоять пробел, который позволяет отличить его от дефиса, поскольку в XML дефис — корректный символ для имени.

Арифметические операции определяются для числовых значений. К числовым значениям относятся значения типов integer, decimal, float, double или типов, производных от них. Если типы операндов арифметической операции различны, операнды приводятся к ближайшему общему типу в соответствии с иерархией приведения integer -> decimal -> float -> double. Если операнд арифметического оператора является узлом, то автоматически извлекается его типизированное значение.

Важный частный случай — применение арифметических операций к пустым последовательностям. В XQuery пустая последовательность иногда используется для представления  отсутствующей или неизвестной  информации, во многом подобно тому, как неопределенное значение используется в реляционных системах. По этой причине операции +, -, *, div и mod определяются таким образом, что они возвращают пустую последовательность, если любой из операндов — пустая последовательность. Для иллюстрации этого правила предположим, что переменная $emps связана с последовательностью элементов emp, каждый из которых представляет сотрудника и содержит элементы name и salary, а также дополнительные элементы comission и bonus. Выражение в Q5 преобразует эту последовательность в последовательность элементов emp, каждый из которых содержит элементы name и pay, причем значение pay равно полной заработной плате сотрудника. Для тех сотрудников, комисионные (commission) или премия (bonus) которых не заданы ($e/commission или $e/bonus — пустая последовательность), генерируемый элемент pay будет пустым.

(Q5) Задана последовательность элементов  emp. Заменить их подэлементы salary, commission и bonus на новый элемент  pay, содержащий сумму значений  исходных элементов, а результирующую последовательность отсортировать по убыванию значений элемента pay.

for $e in $emps

return

  <emp>

   {

   $e/name,

   <pay> {$e/salary + $e/commission+ $e/bonus} </pay>

   }

  </emp>

sortby (pay)

Иногда желательно определять значение по умолчанию, которое может заменять пропущенные операнды в арифметических выражениях. Ниже объясняется, как в этом случае может использоваться функция, определенная пользователем.

Операции над последовательностями

 Оператор intersect порождает последовательность, в которую включены все узлы, имеющиеся в обоих операндах. Оператор except позволяет получить последовательность, содержащую все узлы, которые есть в первом операнде, но отсутствуют во втором.

Операторы union, intersect и except возвращают последовательность узлов в порядке документа и удаляют дубликаты из получившихся последовательностей с учетом индивидуальности узлов. Запрос Q6 является примером использования оператора intersect.

(Q6) Создать новый элемент с  именем recent-large-bids, содержащий копии всех элементов bid документа bids.xml, которые имеют bid-amount со значением больше 1000 и bid-date со значением позже 1 января 2002 года.

<recent-large-bids>

   document("bids.xml")

       /*/ bid [bid-amount > 1000.00]

   intersect

   document("bids.xml")

      /*/ bid [bid-date > date("2002-01-01")]

</recent-large-bids>

Выражения, в которых используются операции union, intersect и except, часто можно  представить в другом виде. Так, запросу Q6 эквивалентен следующий запрос.

<recent-large-bids>

  document("bids.xml")/*/bid

    [bid-amount > 1000.00 and bid-date

    > date("2002-01-01")]

</recent-large-bids>

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

document("items.xml")//itemno

except

document("bids.xml")//itemno

В этом запросе операция except применяется  к двум последовательностям узлов itemno. Поскольку последовательности узлов выбираются из различных документов, ни один узел во второй последовательности не может быть идентичен узлу из первой последовательности. Результатом запроса будет последовательность всех узлов itemno документа items.xml. Если предполагалось с помощью этого запроса получить список элементов itemno для товаров, которые не имеют ставок, то можно добиться этого воспользовавшись библиотечной функцией empty, которая возвращает true, если ее операнд — пустая последовательность.

for $i in document("items.xml")//item

where empty(document("bids.xml")

//bid [itemno eq $i/itemno])

return $i/itemno

В этом примере предикат itemno eq $i/itemno сравнивает два узла itemno, извлекая и  сравнивая их содержимое, а не проверяя их идентичность.

Операция |, оставленная для совместимости с XPath 1.0, эквивалентна операции union. Эти операции иногда применяются в шагах выражения пути. Например, следующее выражение пути находит объединение всех потомков b и потомков c узлов в последовательности, связанной с $a; узлы в этом объединении затем используются в качестве контекстных узлов для следующего шага в пути.

$a/(b | c)/d

Условные выражения

 Условные выражения обеспечивают  возможность выполнения одного  из двух выражений в зависимости  от значения третьего выражения.  Это записывается в знакомом формате if...then...else, поддерживаемом во многих языках. Требуется наличие всех трех условий (if, then и else), а выражение в условии if должно быть заключено в скобки. Результат всего условного выражения зависит от значения выражения в условии if, называемого выражением проверки (test expression). Правила таковы.

Информация о работе Язык XML. Язык запросов X-Query