2003 г

Связи в XML: XLink (часть 2)

Подготовлено: по материалам зарубежных сайтов
Перевод: Intersoft Lab

Расширенные связи

Можно сказать, что простые связи в большей или меньшей степени напоминают связи HTML. Расширенные связи значительно превосходят связи HTML с точки зрения предоставляемых возможностей: они включают многонаправленные связи между многочисленными документами и внешние (out-of-line) связи. Расширенная связь состоит из набора ресурсов и их соединений. Ресурсы, используемые в связи, могут быть либо локальными (являющиеся частью элемента расширенной связи), либо удаленными (не являющиеся частью элемента расширенной связи и обычно находящиеся, хотя и необязательно, в другом документе). Каждый ресурс может быть или адресатом, или источником, либо тем и другим. Если связь не содержит ни одного локального ресурса, а только удаленные ресурсы, она называется внешней связью.

Синтаксис расширенных связей

Расширенные связи подразделяются на удаленные и локальные ресурсы. Локальный ресурс является частью элемента расширенной связи, значение атрибута xlink:type которого равно resource.

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

Сами расширенные связи обозначаются с помощью типа extended и могут считаться просто обертками для элементов типа resource, locator и arc (о последнем речь пойдет ниже).

Предположим, например, что мы описываем страницу связей с сайтами Java. Один из этих сайтов - это Cafe au Lait в http://ibiblio.org/javafaq/. Помимо него существуют еще три "зеркальных отображения" (mirror) в трех странах. Часть людей, зашедших на этот сайт, захочет получить доступ к основному сайту, другая часть предпочтет отправиться на "сайты-зеркала". С помощью XLink можно создать одну связь, которая соединяет все четыре сайта, а также страницу, с которой мы связываемся. При активизации связи браузер сможет выбрать ближайшую к пользователю связь (повторимся, что этот пример является исключительно теоретическим). Четыре сайта описываются с помощью элементов типа locator. Текст, который будет показан пользователю, на нашей странице описывается элементом типа resource. Ниже приведен соответствующий код XML:

<WEBSITE xmlns:xlink="http://www.w3.org/1999/xlink"
         xlink:type="extended">
  <NAME xlink:type="resource">Cafe au Lait</NAME>
  <HOMESITE xlink:type="locator"
            xlink:href="http://ibiblio.org/javafaq/"/>
  <MIRROR xlink:type="locator"
          xlink:href="http://sunsite.kth.se/javafaq"/>
  <MIRROR xlink:type="locator"
          xlink:href="http://sunsite.informatik.rwth-aachen.de/javafaq/"/>
  <MIRROR xlink:type="locator"
          xlink:href="http://sunsite.cnlab-switch.ch/javafaq/"/>
</WEBSITE>

На рисунке 1 показан элемент расширенной связи WEBSITE и эти пять ресурсов. Элемент WEBSITE содержит один ресурс и указывает на другие четыре с помощью универсальных локаторов ресурса. Однако, это всего лишь описание этих ресурсов, без какого-либо соединения между ними.



Рис. 1. Расширенная связь с одним локальным и четырьмя удаленными ресурсами


Правила навигации (элементы типа arc)

По сравнению с простыми связями расширенные связи являются несколько более сложными концепцией, поскольку они предоставляют множество различных путей обхода. Например, в расширенной связи с тремя ресурсами A, B и C возможны девять различных обходов:

Каждый из этих потенциальных путей между ресурсами может иметь различные правила определения того, когда связь должна обходиться и что должно происходить при ее обходе. Эти потенциальные обходы называются ребрами (arc), а в XML они представляются с помощью элементов, у которых значение атрибута xlink:type равно arc. Правила обхода указываются добавлением атрибутов xlink:show и xlink:actuate к элементам типа arc.

Сами элементы типа arc используют атрибуты to и from, для указания направления перехода. Для задания начала и конца перехода применяются атрибуты xlink:label, значения которых сопоставляются для различных ресурсов в расширенной связи. Например, если атрибут xlink:from равен A, а атрибут xlink:to - B, то тогда ребро направляется из ресурса, у которого атрибут xlink:label равен A, в ресурс, чей атрибут xlink:label равен B. Приведенный ниже код демонстрирует сказанное:

<WEBSITE xmlns:xlink="http://www.w3.org/1999/xlink"
         xlink:type="extended" xlink:title="Cafe au Lait">
  <NAME xlink:type="resource" xlink:label="source">
    Cafe au Lait
  </NAME>
  <HOMESITE xlink:type="locator"
           xlink:href="http://ibiblio.org/javafaq/"
           xlink:label="us"/>
  <MIRROR xlink:type="locator"
         xlink:title="Cafe au Lait Swedish Mirror"
         xlink:label="se"
         xlink:href="http://sunsite.kth.se/javafaq"/>
  <MIRROR xlink:type="locator"
         xlink:title="Cafe au Lait German Mirror"
         xlink:label="sk"
         xlink:href="http://sunsite.informatik.rwth-aachen.de/javafaq/"/>
  <MIRROR xlink:type="locator"
         xlink:title="Cafe au Lait Swiss Mirror"
         xlink:label="ch"
         xlink:href="http://sunsite.cnlab-switch.ch/javafaq/"/>
  <CONNECTION xlink:type="arc" xlink:from="source"
              xlink:to="ch"    xlink:show="replace"
              xlink:actuate="onRequest"/>
  <CONNECTION xlink:type="arc" xlink:from="source"
              xlink:to="us"    xlink:show="replace"
              xlink:actuate="onRequest"/>
  <CONNECTION xlink:type="arc" xlink:from="source"
              xlink:to="se"    xlink:show="replace"
              xlink:actuate="onRequest"/>
  <CONNECTION xlink:type="arc" xlink:from="source"
              xlink:to="sk"    xlink:show="replace"
              xlink:actuate="onRequest"/>
</WEBSITE>
Первый элемент CONNECTION описывает ветвь из ресурса с xlink:label, равным "source", в ресурс с xlink:label, равным "ch". Второй элемент CONNECTION описывает ветвь из ресурса с xlink:label, равным "source", в ресурс с xlink:label, равным "us", - и так далее. На рисунке 2 приведена эта связь: овалы показывают ресурсы, а стрелки - ветви. Этот рисунок поход на рисунок 1 с тем исключением, что на нем между ресурсами появились соединения, указанные элементами типа arc.

Рис. 2. Расширенная связь с одним локальным и четырьмя удаленными ресурсами и ветвями, исходящими от локального ресурса к каждому удаленному

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

Внешние связи

Как было указано выше, расширенные связи также могут быть и внешними связями. Внешняя связь не содержит какой-либо части любых ресурсов, которые она соединяет, а хранится в отдельном документе, называемом базой связей (linkbase).

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

В качестве еще одного примера рассмотрим некий учебный курс по Java, публикуемый на Web-сайте. На рисунке 3 показана вводная страница этого курса. Этот курс состоит из 13 занятий (недель - week), каждое из которых охватывает от 30 до 60 страниц лекционного текста. Страница оглавления для каждого занятия включает связи с каждой такой страницей теста, читаемого на занятии.



Рис. 3. Вводная страница курса по Java, состоящего из 13 занятий (недель - week)

Каждая из нескольких сотен станиц, образующих весь этот учебный курс, имеет связи с предыдущим документом (Previous link), следующим документом (Next link) и оглавлением (Top link) для каждого занятия (см. рисунок 4). Если попытаться грубо оценить этот проект, то в нем оказывается задействованным более тысячи внутренних соединений, охватывающих все эти документы.



Рис. 4. Одна из страниц с лекционным текстом, на которой показаны связи Previous, Next и Top

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

Разумное решение - если бы HTML позволяло это - хранить эти связи в отдельном документе. Тогда страницы можно было бы переструктурировать, редактируя этот единственный документ. Такой документ описывал бы связи между главной страницей и отдельными занятиями и, наоборот:

<COURSE xmlns:xlink="http://www.w3.org/1999/xlink"
        xlink:type="extended">
  <TOC xlink:type="locator" xlink:href="index.xml"
       xlink:label="index"/>
  <CLASS xlink:type="locator" xlink:href="week1.xml"
         xlink:label="class"/>
  <CLASS xlink:type="locator" xlink:href="week2.xml"
         xlink:label="class"/>


  <!- Список аналогичных элементов -->

  
         xlink:label="class"/>
  <CLASS xlink:type="locator" xlink:href="week13.xml"
         xlink:label="class"/>
  <CONNECTION xlink:type="arc" from="index" to="class"/>
  <CONNECTION xlink:type="arc" from="class" to="index"/>
</COURSE>

В следующем примере приведена еще одна возможная внешняя расширенная связь. Она обеспечивает предыдущую (previous) и следующую (next) связи между указанными тринадцатью занятиями:

<COURSE xmlns:xlink="http://www.w3.org/1999/xlink"
         xlink:type="extended">
  <CLASS xlink:type="locator" xlink:href="week1.xml"
         xlink:label="1"/>
  <CLASS xlink:type="locator" xlink:href="week2.xml"
         xlink:label="2"/>

  <!- Список аналогичных элементов -->

  <CLASS xlink:type="locator" xlink:href="week13.xml"
         xlink:label="13"/>

  <!-- Связи с предыдущим документом -->
  <CONNECTION xlink:type="arc" xlink:from="2"  xlink:to="1"/>
  <CONNECTION xlink:type="arc" xlink:from="3"  xlink:to="2"/>

  <!- Список аналогичных элементов -->

  <CONNECTION xlink:type="arc" xlink:from="13" xlink:to="12"/>

  <!-- связи со следующим документом -->
  <CONNECTION xlink:type="arc" xlink:from="1"  xlink:to="2"/>
  <CONNECTION xlink:type="arc" xlink:from="2"  xlink:to="3"/>

  <!- Список аналогичных элементов -->
  
  <CONNECTION xlink:type="arc" xlink:from="12" xlink:to="13"/>
</COURSE>

Ниже приведен код, в котором один из элементов типа arc содержит атрибут xlink:arcrole, значение которого равно http://www.w3.org/1999/xlink/properties/linkbase. Атрибут xlink:to этого элемента типа arc должен идентифицировать элемент типа locator, который дает URL этой базы связей. Атрибут xlink:actuate элемента типа arc определяет, загружаются ли эти связи автоматически или для этого требуется пользовательский запрос. Например, если приведенные выше два примера кода находились бы в файле по URL http://ibiblio.org/javafaq/course/courselinks.xml, этот элемент мог бы быть включен в основную страницу для лекций по курсу Java:

<LINKBASE xlink:type="xlink:extended"
          xmlns:xlink="http://www.w3.org/1999/xlink">
  <SOURCE xlink:type="resource" xlink:label="source"/>
  <LINKS xlink:type="locator" xlink:label="linkbase"
         xlink:href=
          "http://ibiblio.org/javafaq/course/courselinks.xml"/>
  <LOAD  xlink:type="arc"
         xlink:arcrole=
          "http://www.w3.org/1999/xlink/properties/linkbase"
         xlink:from="source" xlink:to="linkbase"
         xlink:actuate="onLoad" />
</LINKBASE>