Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-05.doc
Скачиваний:
6
Добавлен:
12.05.2015
Размер:
645.12 Кб
Скачать

5.1.2.2.2. Вычисляемый конструктор

Вычисляемые конструкторы могут создавать узлы следующих видов:

  • узлы-элементы;

  • узлы-атрибуты;

  • узлы документа;

  • текстовые узлы;

  • узлы комментариев;

  • узлы инструкций по обработке.

5.1.2.2.2.1. Вычисляемые конструкторы элемента и атрибута

Вычисляемый конструктор элементаимеет одну из следующих форм:

elementимя-элемента {выражение-для-содержимого}

или

element{выражение} {выражение-для-содержимого}

В первой форме создается элемент с заданным именем-элементаи вычисляемым содержимым. Во второй форме имя элемента является результатом вычислениявыражения.

Аналогичным образом определяются формы вычисляемого конструктора атрибута:

attributeимя-атрибута {выражение-для-значения}

или

attribute{выражение} {выражение-для-значения}

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

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

Запрос на обработку с использованием вычисляемых конструкторов элементов и атрибутов имеет следующий вид:

xquery version "1.0";

declare variable $email-server as xs:string:="mail.com";

declare function local:attr-name($address-index as

xs:integer) as xs:string

{

if($address-index = 1) then "sender" else "receiver"

};

element {fn:concat(fn:substring-before($email-server,"."),

"-",xs:string("message"))}

{

element header

{

element address

{

element from

{

attribute {local:attr-name(1)} {fn:concat('ivanov','@',$email-server)}

},

element to

{

attribute {local:attr-name(2)} {fn:concat('sidorov','@',$email-server)}

}

},

element subject {"О встрече"}

},

element body {fn:concat("Встреча сегодня ",

fn:substring(xs:string(fn:current-date()),1,10),

" в 12.30")}

}

Результат обработки запроса имеет следующий вид:

<mail-message>

<header>

<address>

<from sender="ivanov@mail.com"/>

<to receiver="sidorov@mail.com"/>

</address>

<subject>О встрече</subject>

</header>

<body>Встреча сегодня 2008-03-06 в 12.30</body>

</mail-message>

5.1.2.2.2.2. Вычисляемый конструктор документа

Вычисляемый конструктор документазадается следующим образом:

document{выражение}

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

5.1.2.2.2.3. Вычисляемый конструктор текстового узла

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

text{выражение}

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

5.1.2.2.2.4. Вычисляемый конструктор комментария

Вычисляемый конструктор комментариязадается следующим образом:

comment{выражение}

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

5.1.2.2.2.5. Вычисляемый конструктор инструкции по обработке

Вычисляемый конструктор инструкции по обработкеимеет одну из следующих форм:

processing-instruction приложение {содержимое}

или

processing-instruction {выражение} {содержимое}

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

Пример задания вычисляемого конструктора документа, текстового узла, комментария и инструкции по обработке:

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

xquery version "1.0";

declare variable $email-server as xs:string:="mail.com";

document

{

element message-subjects

{

processing-instruction outputFont {"Arial"},

comment {fn:concat("Сообщение 1 в ",

$email-server)},

element subject

{

attribute from

{fn:concat('ivanov','@',$email-server)},

attribute to

{fn:concat('sidorov','@',$email-server)},

text{"О встрече"}

},

comment {fn:concat("Сообщение 2 в ",

$email-server)},

element subject

{

attribute from

{fn:concat('petrov','@',$email-server)},

attribute to

{fn:concat('sidorov','@',$email-server)},

text{"Поздравление"}

}

}

}

Результат обработки запроса имеет следующий вид:

<?xml version="1.0" encoding="windows-1251"?>

<message-subjects>

<?outputFont Arial?>

<!--Сообщение 1 в mail.com-->

<subject from="ivanov@mail.com"

to="sidorov@mail.com">О встрече</subject>

<!--Сообщение 2 в mail.com-->

<subject from="petrov@mail.com"

to="sidorov@mail.com">Поздравление</subject>

</message-subjects>

Соседние файлы в папке Лекции