69058

Выражения пути в XPath

Лекция

Информатика, кибернетика и программирование

Одна из важнейших функций XPath – это выбор множеств узлов в документе. Особый вид выражений XPath, называемый выражениями пути (path expressions), позволяет выбирать в документе множество узлов в соответствии заданными критериями.

Русский

2014-09-29

287 KB

5 чел.

 22

Лекция 4-06

5.1.1.5. Выражения пути в XPath

 5.1.1.5.1. Синтаксис выражений пути 

 5.1.1.5.2. Шаги с использованием оси поиска

  5.1.1.5.2.1. Оси

  5.1.1.5.2.2. Правила проверки

  5.1.1.5.2.3. Предикаты

 5.1.1.5.2.4. Сокращенный синтаксис выражений с использованием путей поиска

 5.1.1.5.3. Шаги с использованием фильтров

5.1.2. Язык XQuery

 5.1.2.1. Структура запроса XQuery

 5.1.2.1.1. Главный модуль

  5.1.2.1.1.1. Объявления параметров настройки

  5.1.2.1.1.2. Объявления переменных

  5.1.2.1.1.3. Объявления функций

  5.1.2.1.1.4. Объявления опций

  5.1.2.1.1.5. Операторы импорта

  5.1.2.1.1.6. Объявления пространства имен

 5.1.2.1.2. Библиотечный модуль

 5.1.2.2. Конструкторы XQuery

 5.1.2.2.1. Прямой конструктор

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

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

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

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

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

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

 5.1.2.3. Выражения FLWOR

 5.1.2.3.1. Операторы for, let и return

 5.1.2.3.2. Оператор where

 5.1.2.3.3. Оператор order by

5.1.3. Язык XLink

 5.1.3.1. Глобальные атрибуты языка XLink

 5.1.3.2. Простые ссылки

 5.1.3.3. Расширенные ссылки

 5.1.3.4. Внешние ссылки

 5.1.3.5. Задание базового URI для документа XML

5.1.1.5. Выражения пути в XPath

5.1.1.5.1. Синтаксис выражений пути

Одна из важнейших функций XPath – это выбор множеств узлов в документе. Особый вид выражений XPath, называемый выражениями пути (path expressions), позволяет выбирать в документе множество узлов в соответствии заданными критериями.

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

Если выражение пути начинается с символа "/", то поиск начинается с корневого узла документа, а если с символов  "//" – с контекстного узла документа, включая сам контекстный узел. Если символ  "/" задан внутри выражения пути, то выполняется переход к следующему шагу поиска. Символы "//" внутри выражения пути означают, что следующий шаг поиска будет выполняться для потомков контекстного узла документа, включая сам контекстный узел.

В XPath 2.0 определены два вида шагов поиска:

  •  шаг с использованием оси поиска (axis step);
  •  шаг с использованием фильтра (filter step).

5.1.1.5.2. Шаги с использованием оси поиска

Шаги с использованием оси поиска состоят из трех компонент:

  •  оси (axis), указывающей дерево взаимоотношений между текущим узлом контекста и узлами, отбираемыми на данном шаге адресации;
  •  правила проверки узлов, указывающего тип и расширенное название узлов, отбираемых на данном шаге адресации;
  •  нуля или более предикатов, использующих произвольные выражения для дальнейшего отбора в наборе узлов, собранных на данном шаге адресации.

Шаг с использованием оси поиска имеет следующий синтаксис:

имя-оси::проверка-узла[предикат]

Последовательность узлов, полученных на каждом шаге адресации, – это  множество узлов, полученных в результате обработки ранее собранного набора узлов с учетом оси, правила проверки узлов и последующего отсева полученного набора узлов каждым из представленных предикатов.

Пример документа XML:

Следующий документ XML (email.xml) содержит пять сообщений электронной почты:  

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

<email-folder>

<message>

<!-- Сообщение 1 -->

<header>

<address>

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

   <to value="petrov@mail.com"/>

  </address>

  <subject>Поздравление</subject>

</header>

<body>Поздравляю с днем рождения!</body>

 </message>

<message>

 <!-- Сообщение 2 -->

<header>

<address>

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

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

  </address>

  <subject>Напоминание</subject>

</header>

<body>Встречаемся в 10.00.</body>

</message>

<message>

 <!-- Сообщение 3 -->

<header>

<address>

   <from value="sidorov@mail.com"/>

   <to value="ivanov@mail.com"/>

  </address>

  <subject>Отказ</subject>

</header>

<body>Я не смогу в это время.</body>

</message>

<message>

 <!-- Сообщение 4 -->

<header>

<address>

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

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

  </address>

  <subject>Вопрос</subject>

</header>

<body>Когда ты может подойти?</body>

</message>

<message>

 <!-- Сообщение 5 -->

<header>

<address>

   <from value="sidorov@mail.com"/>

   <to value="ivanov@mail.com"/>

  </address>

  <subject>Ответ</subject>

</header>

<body>Я смогу подойти в 12.30.</body>

</message>

</email-folder>

5.1.1.5.2.1. Оси 

Поиск в XML-документе начинается с контекстного узла в дереве XPath и выполняется относительно этого узла.

Ось определяет, какой узел относительно контекстного узла должен быть включен в процесс поиска. Ось также определяет порядок узлов в наборе узлов. Ось, выбирающая узлы, следующие за контекстным узлом в порядке расположения в документе, называется прямой. Ось, выбирающая узлы, предшествующие контекстному узлу, называется обратной. Всего в спецификации XPath определено  13 осей. Графическое представление дерева узлов и оси для документа email.xml приведены на рис. 5.1.2.

Ось self определяет сам контекстный узел (эта ось не имеет направления).

В спецификации XPath определены следующие прямые оси:

  •  ось self – сам контекстный узел;
  •  ось child – все дочерние узлы контекстного узла следующих типов: узлы элементов, текстовых узлов, узлов комментариев и инструкций по обработке (узлы документов, атрибутов и пространств имен не могут быть дочерними узлами);
  •  ось descendantвсе потомки контекстного узла, т.е. все дочерние узлы, дочерние узлы дочерних узлов и так далее;
  •  ось descendant-or-selfсам контекстный узел и все его потомки;
  •  ось following-sibling – все узлы, имеющие тот же родительский элемент, что и контекстный узел, и следующие по порядку за контекстным узлом (если узел является узлом атрибута или узлом пространства имен, эта ось пуста);
  •  ось following – все узлы, имеющие тот же корневой элемент, что и контекстный узел, не являющиеся потомками контекстного узла и следующие по порядку за контекстным узлом;
  •  ось attribute – все узлы атрибутов контекстного узла (эта ось пуста если контекстный узел не является элементом);
  •  ось namespace – все узлы пространства имен контекстного узла (эта ось пуста если контекстный узел не является элементом).

Рис. 5.1.2. Дерево XPath и оси для документа email.xml

В спецификации XPath определены также следующие обратные оси:

  •  ось parent – родительский узел контекстного узла (если узел не имеет родительского узла, эта ось пуста);
  •  ось ancestorвсе предки контекстного узла, т.е. родительский узел,  родительский узел родительского узла и так далее;
  •  ось ancestor-or-selfсам контекстный узел и все его предки;
  •  ось preceding-sibling – все узлы, имеющие тот же родительский элемент, что и контекстный узел, и следующие по порядку перед контекстным узлом (если узел является узлом атрибута или узлом пространства имен, эта ось пуста);
  •  ось preceding – все узлы, имеющие тот же корневой элемент, что и контекстный узел, не являющиеся потомками контекстного узла и следующие по порядку перед контекстным узлом.

5.1.1.5.2.2. Проверка узла

Оси выбирают набор узлов из дерева документа. Этот набор узлов уточняется с помощью проверки узлов (node test). В спецификации XPath определены два типа проверки узлов:

  •  проверка узлов по имени (name test);
  •  проверка узлов по виду (kind test).

При проверке узлов по имени в качестве критерия поиска задается уточненное имя узла (литерал типа QName), т.е. префикс – имя или имена пространств имен, и локальное имя. Имена пространства имен и локальное имя отделяются друг от друга символами ":". Если имя определено в пространстве имен по умолчанию, то префикс отсутствует.

Если вместо префикса указан символ  "*", выбирается узел с заданным локальным именем во всех пространствах имен. Если же символ  "*" указан вместо имени узла,  выбираются все узлы в заданном пространстве имен.

Если вместо уточненного имени узла задан символ  "*", то выбор выполняется для контекстного узла.

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

Примеры задания выражений проверки узлов по имени:

Для документа email.xml можно задать следующие правила проверки:

1. self::header – выбираются все узлы header.

2. child::header – выбираются все дочерние узлы (address и subject) всех узлов header.

3. parent::header – выбираются все родительские узлы message узлов header.

4. ancestor::header – выбираются все узлы message и корневой узел email-folder узлов header.

5. ancestor-or-self::headerвыбираются все узлы message, корневой узел email-folder и сами узлы header.

6. descendant::* – выбираются все потомки контекстного узла.

7. attribute::from – выбираются все атрибуты всех узлов from.

8. attribute::* – выбираются все атрибуты контекстного узла.

Проверка по виду узла реализуется с помощью следующих функций:

  •  element(имя-элемента) – выбирает все узлы-элементы с заданным именем-элемента (если в качестве аргумента задан символ "*", выбираются все узлы-элементы);
  •  element(имя-элемента, тип-элемента) – выбирает все узлы-элементы с заданным именем-элемента и заданным типом-элемента в схеме документа (тип узла определяется либо значением атрибута type в объявлении элемента, либо имени простого или комплексного типа элемента). Если в качестве имени-элемента задан символ "*", выбираются все узлы-элементы, если же в качестве типа-элемента задан символ "*", выбираются узлы-элементы всех типов;
  •  schema-element(имя-элемента) – выбирает все узлы-элементы с заданным в схеме документа объявлением элемента с заданным именем типа QName;
  •  node() – выбирает  все узлы без учета их типа;
  •  text() – выбирает все текстовые узлы;
  •  comment() – выбирает все узлы-комментарии;
  •  processing-instruction(имя-программы) – выбирает все инструкции по обработке с заданным именем-программы обработки (если аргумент не задан, выделяются все инструкции по обработке);
  •  attribute(имя-атрибута) – выбирает все узлы-атрибуты с заданным именем (если в качестве аргумента задан символы "*" или аргумент не задан, выделяются все узлы-атрибуты);
  •  attribute(имя-атрибута, тип-атрибута) – выбирает все узлы-атрибуты с заданным именем и заданным типом в схеме документа (тип узла определяется либо значением атрибута type в объявлении атрибута, либо имени простого или комплексного типа атрибута). Если в качестве имени-атрибута задан символ "*", выделяются все узлы-атрибуты, если же в качестве типа-атрибута задан символ "*", выделяются узлы-атрибуты всех типов;
  •  schema-attribute(имя-атрибута) – выбирает все узлы-атрибуты с заданным в схеме документа объявлением атрибутом с заданным именем типа QName;
  •  document-node(аргумент) выбирает все корневые узлы документа, содержимое которых состоит в точности из одного вложенного элемента.
    В качестве аргумента задается  либо одна из приведенных выше функций
    element(), либо функция schema-element().

Примеры задания выражений проверки узлов по виду:

Для документа email.xml можно задать следующие правила проверки:

1. descendant::text() – выделяет все текстовые элементы потомков контекстного узла.

2. child::element(subject) – выбирает все дочерние элементы с именем subject для контекстного узла.

3. child::element() – выбирает все дочерние элементы контекстного узла (без текстовых узлов и узлов-атрибутов).

4. child::element(*, xs:string) – выбирает все дочерние элементы контекстного узла, содержимое которых является текстовым.  

5. attribute::attribute(value) – выбирает все атрибуты контекстного узла.

5.1.1.5.2.3. Предикаты

При выборе узлов каждый шаг выборки может иметь один или несколько предикатов, которые будут фильтровать выбираемый набор узлов. Предикат – это  выражение одного из приведенных выше типов, результатом вычисления которого является булевское значение true или false. Это выражение  вычисляется для каждого узла выделенного набора, и только в том случае, если результатом является true, узел остается в результирующем наборе.

Фильтрация набора узлов выполняется следующим образом:

  •  Фильтруемое множество сортируется в направлении просмотра оси навигации данного шага. Для осей ancestor, ancestor-or-self, preceding, preceding-sibling фильтруемое множество сортируется в обратном порядке просмотра документа, для остальных осей – в прямом порядке просмотра.
  •  Выражение предиката вычисляется для каждого узла отсортированного множества в следующем контексте:

• Фильтруемый узел (тот, для которого в данный момент вычисляется предикат) становится контекстным узлом.

• Количество узлов фильтруемого множества становится размером контекста.

• Позиция фильтруемого узла в отсортированном множестве становится позицией контекста.

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

• Если результатом вычисления является число, равное позиции контекста, булевым значением предиката будет true, в противном случае – false. Например, предикат [2] равносилен предикату [position()=2] – он обратится в истину только для второго узла фильтруемого множества.

• Все остальные типы данных приводятся к булевому типу в соответствии с приведенными выше правилами.

  •  Из фильтруемого множества исключаются все узлы, булевское значение предиката для которых было false.
  •  В случае, если в шаге выборки было несколько предикатов, процедура фильтрации повторяется с каждым из них, оставляя в отфильтрованном множестве только те узлы, для которых каждый из предикатов будет истиной.

Таким образом, предикаты определяют свойства, которыми должны обладать выбираемые узлы.

Примеры использования предикатов:

1. child::header[position()=1] – выбирает первый  дочерний элемент header  контекстного узла.

2. child::header[position()=last()] – выбирает последний  дочерний элемент header  контекстного узла.

3. child::header[position()=last()-1] – выбирает все, кроме последнего,  дочерние элементы header контекстного узла.

4. child::address[attribute::value="ivanov@mail.com"] – выбирает все дочерние элементы address контекстного узла, которые имеют атрибут value со значением "ivanov@mail.com".

5. child::address[attribute::value="ivanov@mail.com" or

attribute::value="sidorov@mail.com"] – выбирает все дочерние элементы address контекстного узла, которые имеют атрибут value либо со значением "ivanov@mail.com", либо со значением "sidorov@mail.com".

5.1.1.5.2.4. Сокращенный синтаксис выражений с использованием путей поиска

Пути поиска – это наиболее часто используемые выражения в XPath и для того, чтобы сделать их менее громоздкими, в XPath в некоторых случаях для этих выражений можно использовать сокращенный синтаксис.

В спецификации XPath определены следующие сокращения:

  •  если в шаге адресации не указана ось, то предполагается ось child::, поэтому ось child:: часто опускается при описании путей;
  •  символы ".." являются сокращенной записью для выражения parent::node()(родительский узел);
  •  символы "//" является сокращенной записью для выражения /descendant-or-self::node()/ (корневой узел и все его потомки, т.е. все узлы документа);
  •   символ "@" является сокращенной записью для выражения attribute:: (оси атрибутов).

Примеры использования сокращений в путях поиска:

1. .//* — выберет все элементы-потомки контекстного узла.

2. ..//*— выберет все дочерние элементы родителя контекстного узла.

3. @*— выберет все атрибуты контекстного узла.

4. //@* — выберет все атрибуты всех потомков контекстного узла.

5. //* — выберет все элементы документа, содержащего контекстный узел.

6. //@* — выберет все атрибуты всех элементов документа, содержащего контекстный узел.

7. /to — выберет элементы to, принадлежащие дочерним элементам address контекстного узла.

8. to[@value="ivanov@mail.com" or @value="petrov@mail.com"] – выбирает все  дочерние элементы to  текущего узла, в которых атрибут value имеет либо значение  "ivanov@mail.com", либо значение "petrov@mail.com".

5.1.1.5.3. Шаги с использованием фильтров

Шаги с использованием фильтров имеют следующий синтаксис:

первичное-выражение[предикат]

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

  •  числовой литерал (литерал типа xs:integer, xs:decimal или xs:double);
  •  строковый литерал (литерал типа xs:string);
  •  ссылка на переменную (имя переменной, перед которым стоит символ "$");
  •  вызов функции.

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

В предикатах с использованием фильтров может использоваться выражение контекстного элемента – символ ".". Контекстный элемент может быть либо узлом, либо атомарным выражением.

Примеры использования фильтров:

1. (11 to 20)[6] – выбирает шестой элемент (число 16) в последовательности от 11 до 20.

2. (11 to 20)[. mod 2 eq 1] – выбирает нечетные элементы последовательности от 11 до 20 (числа 11, 13, 15, 17 и 19).

3. $header-node[fn:position() = (1 to 3)] – выбирает первые три элемента последовательности в переменной $header-node.

4. fn:doc("email.xml")/fn:root("header") – выбирает корневой элемент для элемента header в документе email.xml.

5. $header-node/comment() – выбирает узлы комментариев для последовательности в переменной $header-node.

5.1.2. Язык XQuery

Одним из важнейших преимуществ при использовании языка XML для хранения данных является гибкость представления самых разнообразных видов информации из разных источников. Для обработки этих данных, в частности, для поиска и выборки по заданным критериям, необходимо соответствующее средство, подобное языку SQL, используемому в релятивистских базах данных.  

Первую задачу – поиск необходимых данных в документах XML решает язык XPath 2.0. Язык XQuery был разработан как расширение XPath 2.0, позволяющее с помощью набора операторов  сформировать запрос к документу XML и получить ответ в виде фрагмента документа XML или полного документа XML.

Спецификация языка XQuery (XQuery 1.0) была принята консорциумом W3 в январе 2007 г. Отдельно была принята спецификация языка XQueryX, в котором запрос к данным формируется как документ XML.

Из осей, определенных в XPath, обязательными для реализации обработчиками XQuery являются оси self, child, parent, descendant, descendant-or-self и attribute. Поддержка осей ancestor, ancestor-or-self, following, following-sibling, preceding и preceding-sibling является необязательной и зависит от реализации.

5.1.2.1. Структура запроса XQuery

Запрос XQuery задается в текстовом файле с расширением .xq, .xql или .xquery и состоит из необязательного объявления версии, а также одного и более фрагментов, называемых модулями.

Объявление версии имеет следующий вид:

xquery version "номер-версии" encoding "кодировка";

Для номера-версии можно пока задать только значение "1.0". Необязательный параметр encoding задает кодировку документа XQuery, например, "utf-8"или "windows-1251".

Модуль может быть либо главным модулем, либо библиотечным модулем.

5.1.2.1.1. Главный модуль

Главный модуль состоит из пролога, за которым следует тело запроса.

Пролог содержит:

  •  объявления параметров настройки;
  •  объявления переменных;
  •  объявления функций;
  •  объявления опций;
  •  операторы импорта;
  •  объявления пространства имен.

Разделителем между компонентами пролога является символ ";".

5.1.2.1.1.1. Объявления параметров настройки

Объявления параметров настройки позволяют задать:

  •  правила обработки граничных пробелов в выражениях;
  •  базовый URI для запроса;
  •  режим работы конструкторов;
  •  режим следования узлов;
  •  порядок следования пустых последовательностей;
  •  копирование пространства имен;
  •  упорядочивание строк по умолчанию.

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

declare boundary-space тип-обработки;

Если для типа-обработки задано значение strip, пробелы в начале и в конце вычисляемого выражения удаляются, если же задано значение preserve – сохраняются.

Базовый URI задается с помощью следующего объявления:

declare base-uri "URI";

Это объявление используется, когда необходимо разрешить относительные ссылки внутри модуля.

Режим работы конструкторов задается с помощью следующего объявления:

declare construction strip тип-обработки;

Если для типа-обработки задано значение strip, типом сконструированного элемента является xs:untyped, все копируемые во время конструирования элементы также получают тип xs:untyped, а атрибуты получают тип xs:untypedAtomic. Если задано значение preserve, типом сконструированного элемента является xs:anyType, а все копируемые во время конструирования элементы и атрибуты сохраняют свои типы.

Режим следования узлов задается с помощью объявления:

declare ordering режим-следования;

Если для режима-следования задано значение ordered, узлы в выражениях пути обрабатываются в том порядке, в котором они следуют в документе, если же задано значение unordered, узлы следуют друг за другом в порядке, определяемом реализацией обработчика запросов.

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

declare default order порядок-следования;

Если для порядка-следования задано значение empty greatest, пустой узел выводится последним, если же задано значение empty least, пустой узел выводится первым.

Копирование пространства имен управляет процессом обработки при копировании узла элемента с помощью конструктора элемента или документа и задается с помощью объявления:

declare copy-namespaces  режим-сохранения, режим-наследования;

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

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

declare default collation "URI"; 

где параметр "URI"задает ресурс, в котором определены правила сравнения символов строк.

5.1.2.1.1.2. Объявления переменных

Объявление переменной с именем имя-переменной (типа QName), типом, определенным в  типе-переменной и начальным значением, задаваемым выражением, имеет следующий вид:

declare variable $имя-переменной as тип-переменной := выражение;

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

Переменные, объявленные без префикса пространства имен, не определены ни в одном пространстве имен и могут быть заданы только в главном модуле.

Переменная, объявленная в другом, импортируемом модуле, должна быть объявлена как внешняя переменная следующим образом:

declare variable $имя-переменной as тип-переменной external;   

Если в этом объявлении задан тип переменной, он должен совпадать с типом переменной в импортируемом модуле.

Примеры задания переменных:

1. declare variable $a as xs:integer :=17; – задана целая переменная $a с начальным значением 17.

2. declare variable $str:="abc"; – задана строковая переменная $a с начальным значением "abc" (тип переменной определяется в результате вычисления выражения).

3. declare variable $math:pi as xs:double external;задана переменная с двойной точностью $math:pi, объявленная в импортируемом модуле.  

5.1.2.1.1.3. Объявления функций

Объявление функции с именем имя-функции (типа QName) имеет следующий вид:

declare function имя-функции($имя-параметра-1 as тип-параметра-1, …) 

as тип-возвращаемого-значения

{

 тело-функции

};

Если имя функции не имеет префикса, имя функции считается заданным в пространстве имен по умолчанию. Для каждого параметра задается его имя и тип. Если ключевое слово as и тип-параметра не задан, либо не задано ключевое слово as и тип-возвращаемого-значения, по умолчанию принимается тип item()*, т.е. произвольная последовательность. После типа параметра или возвращаемого значения может следовать:

  •  символ "?", означающий, что данный параметр может быть задан, а может быть не задан;
  •  символ "*", означающий, что данный параметр может быть задан 0 и более раз;
  •  символ "+", означающий, что данный параметр может быть задан 1 и более раз.

В теле-функции задаются выражения (как правило, конструкторы), реализующие алгоритм функции.

Функции в XQuery могут быть рекурсивными, т.е. в теле функции может быть задан вызов самой функции.

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

Вызов функции имеет следующий вид:

имя-функции(аргумент-1, аргумент-2,…)  

С помощью следующего объявления функция может быть задана как внешняя:

declare function имя-функции($имя-параметра-1 as тип-параметра-1, …) 

as тип-возвращаемого-значения external;

В этом случае используется функция, заданная в импортируемом модуле. Количество параметров и их типы, а также тип возвращаемого значения для внешней и импортируемой функции должны совпадать.

Примеры объявления и использования функций приведены ниже.

5.1.2.1.1.4. Объявления опций  

Объявления опций имеют следующий вид:

declare option имя-опции  "строковый-литерал";

Это объявление определяет опцию с заданным именем и строковым значением. Набор опций и их действия определяется используемым обработчиком запросов XQuery.

5.1.2.1.1.5. Операторы импорта

Операторы импорта могут импортировать данные из другого (библиотечного) модуля или из схемы документа XML.

Оператор импорта библиотечного модуля имеет следующий вид:

import module namespace пространство-имен="целевое-URI"

at "URI-1,…";

В параметре пространство-имен задается префикс целевого пространства имен, а в его значении "целевое-URI" задается идентификатор ресурса для целевого пространства имен. Это целевое пространство имен будет пространством имен по умолчанию для имен переменных и функций, определенных в модуле. После ключевого слова at указывается идентификатор или идентификаторы ресурса для импортируемого модуля. Если в реализации обработчика запросов XQuery можно использовать альтернативный способ задания местоположения импортируемых модулей, ключевое слова at и идентификатор ресурса можно пропустить.

Примеры задания оператора импорта библиотечных модулей:

1. import module namespace myns1="http://my.domain/ns1"

at "http://my.domain/ns1.xq"; – импортирует модуль по адресу "http://my.domain/ns1.xq" с целевым пространством имен myns1, определенным по адресу "http://my.domain/ns1".

2. import module namespace math="http://example.org/math-functions"; – импортирует модуль с целевым пространством имен math, определенным по адресу "http://example.org/math-functions".

Оператор импорта схемы документа XML имеет одну из следующих форм:

import schema namespace пространство-имен="целевое-URI"

at "URI-1,…";

или

import schema default element namespace "целевое-URI"

at "URI-1,…";

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

Примеры задания оператора импорта схемы документа XML:

1. import schema namespace xsd1="http://my.domain/nsxsd1"

at "http://my.domain/nsxsd1.xsd"; – импортирует схему по адресу "http://my.domain/nsxsd1.xsd" с целевым пространством имен xsd1, определенным по адресу "http://my.domain/nsxsd1".

2. import schema default element 

namespace "http://my.dom2/xsd2"; – импортирует схему с целевым пространством имен, которое становится пространством по умолчанию.

5.1.2.1.1.6. Объявления пространства имен

Объявление пространства имен имеет следующий вид:

declare namespace пространство-имен="URI";

Параметр пространство-имен объявляет префикс пространства имен, а его значение задает адрес ресурса для этого пространства имен.

В результате этого объявления создается новый узел пространства имен, связанный с заданным ресурсом.

Пример объявления пространства имен:

declare namespace email="http://email.com"; – объявляет пространство имен  с префиксом email по адресу "http://email.com".

В XQuery определены также пять пространств имен по умолчанию, которые создаются до обработки первого запроса:

  •  xml=http://www.w3.org/XML/1998/namespace – пространство имен XML;
  •  xs=http://www.w3.org/2001/XMLSchema – пространство имен схемы XML;
  •  xsi=http://www.w3.org/2001/XMLSchema-instance – пространство экземпляров схем XML;
  •  fn=http://www.w3.org/2005/xpath-functions – пространство имен функций XPath;
  •  local=http://www.w3.org/2005/xquery-local-functions – пространство имен локальных функций, задаваемых с помощью объявления функции.

Тело запроса, содержащее выражение, вычисляется, и полученное значение является результатом запроса. Формирование тела запроса рассмотрено ниже.

5.1.2.1.2. Библиотечный модуль

Модуль, не содержащий тела запроса, называется библиотечным модулем. Первым оператором библиотечного модуля является оператор объявления модуля

module namespace пространство-имен="целевое-URI";

В параметре задается префикс целевого пространства имен в модуле, а в его значении "целевое-URI" задается идентификатор ресурса для целевого пространства имен.

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

Пример задания оператора объявления модуля:

module namespace math="http://example.org/math-functions"; – объявляет модуль с целевым пространством имен  с префиксом math по адресу "http://example.org/math-functions".

5.1.2.2. Конструкторы XQuery

В языке XQuery определены специальные выражения – конструкторы, создающие структуры XML в формируемом запросе. Конструкторы определены для узлов документов, элементов, атрибутов, текстовых узлов и узлов инструкций для обработки. Язык XQuery обеспечивает два вида конструкторов:

  •  прямой конструктор (direct constructor);
  •  вычисляемый конструктор (computed constructor).

5.1.2.2.1. Прямой конструктор  

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

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

Если символы "{" и "}"  используются в конструкторе как обычные символы, они должны быть удвоены, т.е. заменены символами "{{" и "}}". Можно также использовать ссылки на символы: &#x7b; для символа "{" и &#x7d; для символа "}".

Результатом действия конструктора является новый узел-элемент.

Начальный тег конструктора и вложенных элементов может содержать один и более атрибутом. Имя атрибута должно быть типа QName, а значение – строкой, заключенной в одиночные или двойные апострофы. Так же, как и содержимое элемента, значение атрибута может содержать вычисляемые выражения в фигурных скобках "{" и "}".

Каждый атрибут в прямом конструкторе элемента создает свой собственный узел-атрибут.

Текстовым значением созданного узла является конкатенация содержимого всех входящих в него текстовых узлов.

Прямые конструкторы узлов комментариев и узлов инструкций по обработке записываются в конструкторе в том виде, в каком они появятся в документе XML.

Пример задания прямого конструктора:

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

xquery version "1.0";

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

<message>

<header>

  <address>

<from value="{fn:concat('ivanov','@',$email-server)}"/>

<to value="{fn:concat('sidorov','@',$email-server)}"/>

  </address>

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

     </header>

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

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

    " в 12.30")}</body>

 </message>

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

<message>

<header>

 <address>

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

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

 </address>

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

</header>

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

</message>

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

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

  •  узлы-элементы;
  •  узлы-атрибуты;
  •  узлы документа;
  •  текстовые узлы;
  •  узлы комментариев;
  •  узлы инструкций по обработке.

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

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

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

или

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

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

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

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

или

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

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

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

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). Во второй форме параметр приложение является результатом вычисления выражения.

5.1.2.3. Выражения FLWOR

Запрос к документу XML имеет одну из следующих общих форм:

оператор-for  

оператор-let 

оператор-where  

оператор-order-by 

return выражение

По первым буквам используемых в выражении операторов (for, let, where, order by и return) эти выражения были названы выражениями FLWOR.

Обязательный оператор return конструирует результат выполнения выражения и возвращает его как результат выполнения всего выражения FLWOR.

5.1.2.3.1. Операторы for, let и return

Операторы for и let имеют следующий вид:

for $переменная-1 at $ переменная-цикла-1 as тип-1 in выражение-1,

$переменная-2 at $ переменная-цикла-2  as тип-2 in выражение-2,…

let $переменная-1 as тип-1 := выражение-1,

$переменная-2 as тип-2 := выражение-2,…

Операторы for и let генерируют упорядоченную последовательность узлов и/или атомарных значений. В выражении может быть более одного оператора for и/или let, но обязательно должен быть хотя бы один из них. Каждое выполнение операторов for и let формируют кортеж (turple) – упорядоченный набор из одной или нескольких переменных.

В простом случае в операторе for определена одна переменная и заданное для нее выражение (значение этого выражения называется связывающей последовательностью для переменной).  Оператор for выполняет итерацию по элементам связывающей последовательности. Если же в операторе for определены несколько переменных,  итерация выполнятся для каждой переменной по элементам ее связывающей последовательности. Результатом этих операций является поток кортежей (turple stream), содержащий один кортеж для каждой комбинации значений в соответствующих связывающих последовательностях.

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

Для каждой переменной, задаваемой в операторах for и let, может быть определен (после ключевого слова as)  тип переменной. Тип результата вычисления выражения для переменной должен совпадать с заданным типом переменной.

В операторе for каждая переменная может иметь заданную для нее (после ключевого слова at) индексную переменную, которая имеет тип xs:integer. При итерации переменных по элементам связывающей последовательности, индексная переменная выполняет итерацию над целыми, представляющими индексы этих элементов в связывающей последовательности, начиная с 1. Расширенное имя QName для индексной переменной должно отличаться от расширенного имени QName переменной, для которой задана индексная переменная.

Обязательный оператор return вычисляет выражение (обычно конструктор) для каждого кортежа в потоке кортежей, затем результаты этих вычислений сцепляются друг с другом, образуя    результат выполнения всего выражения FLWOR.

5.1.2.3.2. Оператор where

Необязательный оператор where имеет следующую форму:

where выражение

Этот оператор выполняет роль фильтра для кортежей связанных переменных, полученных в результате выполнения операторов for и let. Заданное в операторе выражение вычисляется для каждого из кортежей  и, если результат вычисления равен true, кортеж остается в последовательности. Если же  результат вычисления равен false, кортеж удаляется из последовательности.

5.1.2.3.3. Оператор order by

Необязательный оператор order by изменяет порядок вывода элементов в кортеже и имеет одну из следующих форм:

order by выражение-1 модификатор-порядка-1,…

или

stable order by выражение-1 модификатор-порядка-1,…

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

Первая компонента может иметь либо значение ascending (сортировка в возрастающем порядке), либо значение descending (сортировка в убывающем порядке).

Вторая компонента может иметь либо значение empty greatest (пустой элемент – в конце потока кортежей), либо значение empty least (пустой элемент – в начале потока кортежей).

Третья компонента задается в виде

collation "URI" 

где "URI"  – ссылка на ресурс, содержащий правила сравнения строк.

Если оператор order by задан,  для каждого кортежа в потоке кортежей вычисляются значения выражения с учетом связей переменных. Относительный порядок двух кортежей определяется сравнением их значений слева направо в соответствии с заданным выражением и модификатором-порядка  пока не встретится пара неравных значений.

Если в операторе order by используется ключевое слово stable, при сравнении, если два кортежа равны, они сохраняют тот же относительный порядок, что и в исходной последовательности.

5.1.3. Язык XLink

В HTML ссылка на другой документ выполняется с помощью дескриптора <a> с обязательным атрибутом href, в котором указывается URI того документа, на который производится ссылка. Кроме того, с помощью этого же дескриптора с атрибутом name или id можно пометить любой элемент документа, для того, чтобы на этот элемент можно было сослаться в атрибуте href.

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

  •  ссылка может быть только однонаправленной, т.е. сослаться можно только на один документ или фрагмент документа;
  •  ссылаться можно только на помеченный элемент, т.е. ссылки на второе предложение третьего абзаца недопустимы;
  •  ссылки по контексту (содержимому) документа, например, абзац или предложение, содержащее слово Internet в документе недопустимы;
  •  ссылка выполняется только при щелчке мышью;
  •  документ, на который ссылается данный документ, всегда замещает данный документ;
  •  ссылка не учитывает историю предыдущих ссылок, а также отношений между документами.  

Для преодоления этих недостатков консорциумом W3C были разработаны два языка: язык связывания  XMLXLink (XML Linking Language)   и язык указателей XMLXPointer (XML Pointer Language).

Язык XLink определяет, как один документ XML связывается с другим документом, а язык XPointer определяет, как адресуются отдельные части документа.

5.1.3.1. Глобальные атрибуты языка XLink

Спецификация языка XLink версия 1.0 была принята в 2001 году. Согласно этой спецификации любой элемент XML может использоваться в качестве ссылки или части ссылки, если в нем определены глобальные атрибуты языка XLink: type, href, role, arcrole, title, show, actuate, label, from и to.

Атрибуты языка XLink определены в пространстве имен этого языка (обычно xlink), поэтому в элементах, в которых используются атрибуты  XLink, либо в корневом элементе документа XML должен быть задан атрибут

xmlns:xlink="http://www.w3.org/1999/xlink".

Основным атрибутом языка XLink является обязательный атрибут xlink:type, определяющий тип ссылки. Использование остальных атрибутов зависит от заданного типа ссылки. Атрибут xlink:type может иметь одно из следующих значений: "simple", "extended", "locator", "arc", "resource", "title" или "none".

5.1.3.2. Простые ссылки 

Простые ссылки определяются заданием для атрибута xlink:type значения "simple". Простая ссылка определяет два ресурса: локальный и удаленный и исходящую дугу (arc) связи – от локального ресурса к удаленному. Для простой ссылки могут быть заданы атрибуты xlink:href, xlink:role, xlink:arcrole xlink:title, xlink:show и xlink:actuate, причем все атрибуты являются необязательными.

Атрибут xlink:href задает URI удаленного ресурса в форме, принятой в HTML..

Атрибуты xlink:role и xlink:arcrole задают URI ресурсов, более подробно описывающих заданный в атрибуте xlink:href удаленный ресурс и дугу к этому ресурсу.  

Атрибут xlink:title содержит строку описания удаленного ресурса.

Атрибут xlink:show определяет режим загрузки удаленного ресурса и может иметь одно из следующих значений: "new" – удаленный ресурс должен загружаться в новое окно или фрейм, "replace" – удаленный ресурс должен загружаться в то же окно или фрейм, "embed" – удаленный ресурс должен загружаться в том месте документа, в котором находится элемент вызова (так же, как дескриптор <img> в HTML заменяется изображением), "other" и "none" – другие способы загрузки, определяемые пользовательским агентом (браузером).

Атрибут xlink:actuate определяет способ актуализации ссылки и может иметь одно из следующих значений: "onLoad" – переход к ресурсу выполняется сразу же после загрузки документа, "onRequest" – переход к ресурсу выполняется сразу же после наступления некоторого события (например, щелчка мыши по ссылке), "other" и "none" – другие способы актуализации, определяемые пользовательским агентом (браузером).

Пример использования простых ссылок в документе XML:

Определение DTD для элемента simple-link, описывающего простую ссылку, может иметь следующий вид:

<!ELEMENT COMPOSER (#PCDATA)>

  <!ATTLIST COMPOSER

xlink:type CDATA #FIXED 'simple'

xlink:role CDATA #IMPLIED

xlink:title CDATA  #IMPLIED

 CDATA  #REQUIRED

xlink:show    (new|replace|embed|other|none)

#IMPLIED 'replace'

xlink:actuate (onRequest|onLoad|other|none)

    #IMPLIED 'onRequest'

>

Элемент в документе XML, соответствующий этому DTD может иметь следующий вид:

<simple-link xlink:type="simple"

xlink:href="http://mycompany.com/index#part2.html"

xlink:title="Моя фирма">

Ссылка на мою фирму

</simple-link>.

5.1.3.3. Расширенные ссылки

Расширенные ссылки определяются заданием для атрибута xlink:type значения "extended". Расширенная ссылка – это ссылка, которая связывает произвольное число ресурсов, как локальных, так и удаленных. Помимо атрибута xlink:type, для расширенных ссылок могут быть заданы описанные выше атрибуты xlink:role и xlink:title.

Элементы с атрибутом xlink:type="extended" могут содержать элементы со значениями xlink:type, равными "locator", "arc", "resource" и "title".

Элемент со значением xlink:type, равным "title", содержит описание расширенного элемента и не содержит других атрибутов, кроме xlink:type. Может быть задано несколько элементов описания (например, на разных языках).

Элемент со значением xlink:type, равным "locator", определяет удаленный ресурс, участвующий в ссылке. Для этого элемента могут быть также заданы описанные выше атрибуты xlink:href, xlink:role и xlink:title, а также атрибут xlink:label. Атрибут xlink:href является обязательным и указывает URI удаленного ресурса, остальные атрибуты являются необязательными.

Атрибут xlink:label обеспечивает элементу со значением xlink:type, равным "arc", ссылку для создания дуги перехода.

Элемент, описывающий удаленный ресурс, может содержать элемент описания ресурса (элемент со значением xlink:type, равным "title").

Элемент со значением xlink:type, равным "resource", определяет локальный ресурс, участвующий в ссылке. Для этого элемента могут быть также заданы описанные выше атрибуты xlink:role, xlink:title и xlink:label.

Элемент со значением xlink:type, равным "arc", определяет правила прохождения ресурсов (дугу). Для этого элемента могут быть также заданы описанные выше атрибуты xlink:arcrole, xlink:title, xlink:show, xlink:actuate, а также атрибуты xlink:from и xlink:to (все атрибуты являются необязательными).

Значениями атрибутов  xlink:from и xlink:to, определяющих соответственно начало и окончание дуги перехода, должны быть значения атрибута  xlink:label в элементах "locator"или "resource".

Элемент, описывающий дугу, может содержать элемент описания ресурса (элемент со значением xlink:type, равным "title").

Пример использования расширенной ссылки в документе XML:

Определение DTD для элемента extended-link, описывающего расширенную ссылку, может иметь следующий вид:

<!ELEMENT extended-link ((tooltip|person|course|gpa|go)*)>

  <!ATTLIST extended-link

     xmlns:xlink CDATA #FIXED

   "http://www.w3.org/1999/xlink"

     xlink:type (extended) #FIXED "extended"

   xlink:role CDATA #IMPLIED

   xlink:title CDATA #IMPLIED>

<!ELEMENT tooltip ANY>

  <!ATTLIST tooltip

     xlink:type (title) #FIXED "title"

     xml:lang CDATA #IMPLIED>

<!ELEMENT person EMPTY>

  <!ATTLIST person

     xlink:type (locator) #FIXED "locator"

   xlink:href CDATA #REQUIRED

     xlink:role CDATA #IMPLIED

   xlink:title CDATA #IMPLIED

   xlink:label NMTOKEN #IMPLIED>

<!ELEMENT course EMPTY>

  <!ATTLIST course

     xlink:type (locator) #FIXED "locator"

     xlink:href CDATA #REQUIRED

     xlink:role CDATA #FIXED

       "http://www.example.com/linkprops/course"

     xlink:title CDATA #IMPLIED

     xlink:label NMTOKEN #IMPLIED>

<!ELEMENT gpa ANY>

  <!ATTLIST gpa

     xlink:type (resource) #FIXED "resource"

     xlink:role CDATA #FIXED

        "http://www.example.com/linkprops/gpa"

     xlink:title CDATA #IMPLIED

   xlink:label NMTOKEN #IMPLIED>

<!ELEMENT go EMPTY>

  <!ATTLIST go

     xlink:type (arc) #FIXED "arc"

     xlink:arcrole CDATA #IMPLIED

   xlink:title CDATA #IMPLIED

     xlink:show (new|replace|embed|other|none) #IMPLIED

     xlink:actuate (onLoad|onRequest|other|none) #IMPLIED

     xlink:from NMTOKEN #IMPLIED

     xlink:to NMTOKEN #IMPLIED>.

Элемент в документе XML, соответствующий этому DTD может иметь следующий вид:

<extended-link>

  <tooltip>Загрузка курса для Иванова</tooltip>

  <person

     xlink:href="students/ivanov62.xml"

     xlink:label="student62"

     xlink:role="http://www.example.com/linkprops/student"

     xlink:title="Иванов" />

  <person

     xlink:href="profs/petrov7.xml"

     xlink:label="prof7"

     xlink:role="http://www.example.com/linkprops/prof"

     xlink:title="Dr. Jay Smith"/>

 <!-- Другие удаленные ресурсы для преподавателей и

 студентов -->

 <course

    xlink:href="courses/cs101.xml"

    xlink:label="CS-101"

    xlink:title="Computer Science 101" />

 <!-- Другие удаленные ресурсы для лекций, лабораторных

 работ и т.д.-->

 <gpa xlink:label="IvanovGPA">3.5</gpa>

 <go

    xlink:from="student62"

    xlink:to="IvanovGPA"

    xlink:show="new"

    xlink:actuate="onRequest"

    xlink:title="Рейтинг Иванова" />

 <go

    xlink:from="CS-101"

    xlink:arcrole="http://www.example.com/links/auditor"

    xlink:to="student62"

    xlink:show="replace"

    xlink:actuate="onRequest"

    xlink:title="Проверка Иванова" />

 <go

    xlink:from="student62"

    xlink:arcrole="http://www.example.com/links/advisor"

    xlink:to="prof7"

    xlink:show="replace"

    xlink:actuate="onRequest"

    xlink:title="Сидоров, консультант" />

</extended-link>.

5.1.3.4. Внешние ссылки

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

Для того, чтобы указать, что ссылка является внешней надо в элементе типа "arc" в атрибуте xlink:arcrole задать значение

xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase",

а в атрибуте задать ссылку на документ XML, содержащий внешние ссылки.

Пример внешней ссылки:

Определение DTD для элемента external-link, описывающего загрузку внешней ссылки, может иметь следующий вид:

<!ELEMENT external-link ((startrsrc|linkbase|load)*)>

<!ATTLIST external-link

  xlink:type (extended) #FIXED "extended">

<!ELEMENT startrsrc EMPTY>

  <!ATTLIST startrsrc

     xlink:type (locator) #FIXED "locator"

     xlink:href CDATA #REQUIRED

     xlink:label NMTOKEN #IMPLIED>

<!ELEMENT linkbase EMPTY>

  <!ATTLIST linkbase

     xlink:type (locator) #FIXED "locator"

   xlink:href CDATA #REQUIRED

   xlink:label NMTOKEN #IMPLIED>

<!ELEMENT load EMPTY>

  <!ATTLIST load

     xlink:type (arc) #FIXED "arc"

     xlink:arcrole CDATA #FIXED

       "http://www.w3.org/1999/xlink/properties/linkbase"

     xlink:actuate (onLoad|onRequest|other|none) #IMPLIED

   xlink:from NMTOKEN #IMPLIED

   xlink:to NMTOKEN #IMPLIED>.

Элемент в документе XML, соответствующий этому DTD может иметь следующий вид  (внешние ссылки размещены в документе linkbase.xml):

<external-link>

   <startrsrc xlink:label="spec" xlink:href="spec.xml" />

   <linkbase xlink:label="linkbase"

 xlink:href="linkbase.xml" />

   <load xlink:from="spec" xlink:to="linkbase"

 actuate="onLoad" />

</external-link>.

5.1.3.5. Задание базового URI для документа XML

Адрес ресурса URI в атрибутах xlink:href, xlink:role и xlink:arcrole можно задавать как в абсолютной форме (указывая полный путь к данному ресурсу), так и в относительной форме (относительно базового каталога). По умолчанию, базовым каталогом считается текущий каталог. В документе XML можно явно указать базовый каталог с помощью атрибута xml:base, определенного в спецификации XML Base, принятой в 2001 году. Этот атрибут может быть задан в любом элементе документа XML.

Пример использования атрибута xml:base:

<?xml version="1.0"?>

<doc xml:base="http://example.org/today/"

  xmlns:xlink="http://www.w3.org/1999/xlink">

  <head>

     <title>Виртуальная библиотека</title>

  </head>

  <body>

     <paragraph>Просмотр <link xlink:type="simple"

   xlink:href="new.xml">новых поступлений</link>!

 </paragraph>

     <paragraph>Новые поступления!</paragraph>

     <olist xml:base="/hotpicks/">

        <item>

           <link xlink:type="simple"

    xlink:href="pick1.xml">Поступление 1</link>

        </item>

        <item>

           <link xlink:type="simple"

              xlink:href="pick2.xml">Поступление 2</link>

        </item>

     </olist>

  </body>

</doc>.

Здесь в элементе doc определяется базовый каталог для всего документа XML, а в элементе olist – определяется базовый каталог для этого элемента относительно базового каталога всего документа.    

Файл: file:///web/1/5fan/public_html/www/files/13/5fan_ru_69058_cee465bd0cf1181cb32423c4b01da715.doc   Создан: 2008-02-25T17:15:00Z Модифицирован: 2008-02-25T17:15:00Z     Автор:

email-folder

Сообщение 1

header

body

Поздравляю…

Поздравление

message

address

from

value

subject

to

value

Сообщение 2

header

body

Встречаемся…

Напоминание

message

address

from

value

subject

to

value

Сообщение 3

header

body

Я не смогу…

Отказ

message

address

from

value

subject

to

Сообщение 4

header

body

Когда ты…

Запрос

message

address

from

value

subject

to

value

Сообщение 5

header

body

Я могу…

Ответ

message

address

from

value

subject

to

value

self

preceding-sibling

ancestor

child

descendant

following-sibling

parent

attribute

value

preceding

following

– узел элемента

– узел комментария

– текстовый узел

– узел атрибута


 

А также другие работы, которые могут Вас заинтересовать

50906. Измерение удельного заряда электрона методом магнетрона 40 KB
  Наименование средства измерения Предел измерения Цена деления шкалы Класс точности Предел основной погрешности Вольтметр Микроамперметр Амперметр Магнетрон: А соленоид D = мм L= мм N= ; Б диод R= мм Погрешности: А Б 3.Оценка границ погрешностей результата измерения; 9.
50908. Применение технических средств системы охранного телевидения для предупреждения угроз несанкционированного доступа злоумышленника к конфиденциальной информации 1.18 MB
  Первичный источник видеосигнала в составе системы охранной сигнализации; видеоканал: Совокупность технических средств СОТ обеспечивающих передачу телевизионного изображения от одной видеокамеры до экрана видеомонитора в составе СОТ; видеомонитор: Устройство отображения видеоинформации в составе СОТ; видеорегистратор: Устройство предназначенное для записи воспроизведения и хранения видеоинформации в составе СОТ; видеосервер: Устройство предназначенное для работы в составе цифровой СОТ и обеспечивающее преобразование аналогового...
50909. ОПРЕДЕЛЕНИЕ СКОРОСТИ ПУЛИ ПРИ ПОМОЩИ КРУТИЛЬНОГО БАЛЛИСТИЧЕСКОГО МАЯТНИКА 470 KB
  Цель работы: изучение принципа работы баллистического маятника и закона сохранения момента импульса экспериментальная проверка зависимостей между физическими величинами характеризующими крутильные колебания; экспериментальное определение постоянной упругих сил кручения и момента инерции баллистического маятника; определение коэффициента затухания крутильных колебаний. экспериментальное определение с помощью баллистического маятника скорости пуле. Она состоит из: баллистического маятника.
50912. Изучение поляризации отраженного от диэлектриков света 51 KB
  Для определения значения угла Брюстера по компоненте интенсивности отраженного света параллельной плоскости падения проводим измерения I2 в области ее минимальных значений изменяя значения угла с шагом 1. Зависимость интенсивности компоненты отраженного света параллельной плоскости падения от угла падения удобно занести в таблицу.644 Вывод: изучили свойства света поляризованного при отражении от диэлектриков изучили законы поляризации света при отражении от прозрачной среды.
50913. Построение теста с помощью MS Excel 549.5 KB
  Для организации выбора варианта ответа выполняем последовательность действий: Выбирается пункт меню Данные – Проверка В диалоговом окне выбирается тип данных Список В окне Источник перечисляются варианты ответов через точку с запятой. Например: Для подведения итогов тестирования можно предусмотреть специальный лист на котором будут подведены итоги ответов на каждый вопрос. Например: Для выставления оценки необходимо подсчитать какое количество процентов составляет число правильных ответов от общего числа вопросов исходя из общих...