Подготовлено: по материалам зарубежный сайтов
Перевод: Intersoft Lab
Непременное условие успеха технологии Web лежит в ее способности связывать ресурсы. То, что "Всемирная паутина" опирается на признанный гоферовский протокол, может быть объяснено хотя бы тем, что HTML позволяет вставлять в документы ссылки гипертекста. С их помощью можно помещать изображения на страницы документов, а также переходить от одного документа к другому или же от одной его части к другой. С учетом того, что XML может быть преобразован в HTML для последующего просмотра, синтаксис, который, используется в HTML для задания связей, может быть перенесен и в XML.
Однако, связывание в HTML имеет ряд ограничений. Универсальные локаторы ресурсов (URL) указывают только на один документ. Большая глубина детализации, например, третье предложение в семнадцатом параграфе, невозможно, если, конечно, в рассматриваемом документе заранее не расставлены поименованные указатели (anchor). Но для этого необходимо иметь доступ к документу, на который требуется указывать.
XLink - это технология, которая позволяет решить указанные проблемы и установить более сложные связи между документами. XLink предназначена исключительно для работы с документами XML.
Связывание в XML состоит из двух частей: XLink и XPointers. XLink (XML Linking Language, Расширяемый язык соединений) определяет, как один документ связывается с другим. XPointers (XML Pointer Language, Расширяемый язык указателей) описывает, как общаются отдельные части документов. XLink указывает на универсальный локатор ресурса (URI), который устанавливает отдельный ресурс.
Предположим, что вы хотите выразить на XML отношение между художником и окружающей его обстановкой. Это подразумевает создание связей между этим творческим работником и его наследием, а также задание связи к описанию исторических событий, имевших место на протяжении его жизни. Данные о художнике могут быть записаны в следующем файле:
<?xml version="1.0"?>
<artistinfo>
<surname>Modigliani</surname>
<name>Amadeo</name>
<born>July 12, 1884</born><died>January 24, 1920</died>
<biography>
<p>In 1906, Modigliani settled in Paris, where ...</p>
</biography>
</artistinfo>
Помимо этого, в отдельные файлы включаются описания периодов, на которые можно условно разбить его творчество:
<?xml version="1.0"?>
<period>
<city>Paris</city>
<country>France<country>
<timeframe begin="1900" end="1920"/>
<title>Paris in the early 20th century (up to the twenties)</title>
<end>Amadeo</end>
<description>
<p>During this period, Russian, Italian, ...</p>
</description>
</period>
Выполнение поставленного выше задания (то есть создание файла, который устанавливает связь между художником и его творческим наследием и этапами творческого пути) является задачей, которую невозможно решить с помощью "HTML-ных" тегов <a> и атрибутов "img". Это объясняется целым рядом причин:
В XLink используются два типа связующих элементов (linking elements): simple (простой) - подобный "a" и "img" в HTML - и extended (расширенный). Однако, XLink не требует задания какого-либо определенного "корректного" имени для связей; наоборот, эта технология позволяет решить, какие элементы будут использоваться в качестве связей. Достигается это с помощью атрибута XLink type (тип). Приведенный ниже фрагмент иллюстрирует сказанное:
<environment xlink:type="extended">
<!-- Это расширенная связь -->
<!-- Здесь должны быть включены/указаны задействованные ресурсы -->
</environment>
После того, как мы объявили расширенную связь, необходимо указать задействованные ресурсы. Поскольку информация о художнике и его жизни хранится вне нашего документа (и, следовательно, мы не можем ею управлять), чтобы ссылаться на нее, воспользуемся элементами XLink, атрибуты которых имеют значение locator. Напомним еще раз, что подход заключается не в задании имени тега, а в том, чтобы с помощью атрибутов XLink позволить помечать элементы как элементы типа locator:
<environment xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:type="extended">
<!-- Ресурсы, задействованные в нашей связи, - художник -->
<!-- он сам, его наследие и периоды творчества -->
<artist xlink:type="locator" xlink:label="artist"
xlink:href="modigliani.xml"/>
<influence xlink:type="locator" xlink:label="inspiration"
xlink:href="cezanne.xml"/>
<influence xlink:type="locator" xlink:label="inspiration"
xlink:href="lautrec.xml"/>
<influence xlink:type="locator" xlink:label="inspiration"
xlink:href="rouault.xml"/>
<history xlink:type="locator" xlink:label="period"
xlink:href="paris.xml"/>
<history xlink:type="locator" xlink:label="period"
xlink:href="kisling.xml"/>
</environment>
В этом примере упущен только один момент: необходимо указать, как ресурсы относятся друг к другу. Для этого используются атрибуты, значения которых равны arc:
<environment xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:type="extended">
<!-- художник привязан к своему наследию и периодам творчества -->
<artist xlink:type="locator" xlink:role="artist"
xlink:href="modigliani.xml"/>
<influence xlink:type="locator" xlink:label="inspiration"
xlink:href="cezanne.xml"/>
<influence xlink:type="locator" xlink:label="inspiration"
xlink:href="lautrec.xml"/>
<influence xlink:type="locator" xlink:label="inspiration"
xlink:href="rouault.xml"/>
<history xlink:type="locator" xlink:label="period"
xlink:href="paris.xml"/>
<history xlink:type="locator" xlink:label="period"
xlink:href="kisling.xml"/>
<bind xlink:type="arc" xlink:from="artist"
xlink:to="inspiration"/>
<bind xlink:type="arc" xlink:from="artist"
xlink:to="period"/>
</environment>
Нетрудно видеть, что использование XLink позволяет упростить нашу задачу и свести ее к созданию файла XML, содержащего элементы, подобные приведенным выше, где ясно и четко указаны все ресурсы и их отношения. Перейдем теперь к детальному рассмотрению механизма связывания XLink: атрибутов, их значений и правил их использования.
Как было указано выше, с помощью атрибута XLink xlink:type используемые элементы могут быть определены как связующие. Этот атрибут может иметь одно из следующих значений:
Префикс xlink должен быть привязан к универсальному идентификатору ресурса (URI) пространства имен http://www.w3.org/1999/xlink:
<my_element xmlns:xlink="http://www.w3.org/1999/xlink"> ...
Как обычно, этот префикс может меняться, при условии, что URI остается прежним. Префикс xlink является привычным и должен использоваться, если у вас нет действительно веских причин, чтобы его изменить.
Помимо указанного атрибута type XLink предоставляет ряд атрибутов, называемых глобальными, которые позволяют установить, является ли рассматриваемый элемент связующим, а также определить многие его свойства (например, когда загружать связанные ресурсы, как их увидеть, если они загружены, и так далее). В приведенной ниже таблице перечислены глобальные атрибуты, поддерживаемые XLink:
Таблица 1. Глобальные атрибуты
Атрибут определения типа | type |
Атрибут локатор | href |
Семантический атрибут | role, arcrole, title |
Атрибут поведения | show, actuate |
Атрибут обхода | label, from, to |
Важное замечание. Согласно принятой терминологии, если элемент включает атрибут type со значением V, этот элемент именуется как элемент типа V, каким бы ни было его действительное имя.
Отношение элемента к определенному типу XLink накладывает на использование элементов следующие ограничения:
<!-- поскольку A - элемент типа simple, все информация,
которая ему необходима, - в атрибуте href. Было бы бессмысленно
приводить подэлемент типа locator -->
<a xlink:type="simple" href="monet.html"> ... никакой другой
элемент xlink здесь ни к чему... </a>
<!-- поскольку bookref - элемент типа locator, ему нужен атрибут href,
чтобы указывать на внешний ресурс, но было
бессмысленно приводить для него атрибут from, который
зарезервирован для значений arc. -->
<bookref xlink:type="locator" href="ficciones.xml"/>
В приведенных ниже таблицах перечислены ограничения, накладываемые на применение атрибутов и подэлементов каждого типа. В таблице 2 приняты следующие обозначения: "R" означает "обязательный", а "O" - "факультативный". Пробел означает недопустимое сочетание.
В таблице 3 показано, для каких элементов XLink какие подэлементы XLink являются допустимыми.
Таблица 2. Правила использования атрибутов (в соответствии с рекомендацией консорциума W3C)
Атрибут | simple | extended | locator | arc | resource | title |
type | R | R | R | R | R | R |
href | O | R | ||||
role | O | O | O | O | ||
arcrole | O | O | ||||
title | O | O | O | O | O | |
show | O | 0 | ||||
actuate | O | O | ||||
label | 0 | 0 | ||||
from | 0 | |||||
to | O |
Таблица 3. Значимые типы потомка (в соответствии с рекомендацией консорциума W3C)
Тип предка | Значимые типы элемента потомка |
simple | - |
extended | locator, arc, resource, title |
locator | title |
arc | title |
resource | - |
title | - |
Рассмотрим следующий пример:
<COMPOSER xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:type="simple"
xlink:href="http://www.users.interport.net/~beand/">
Beth Anderson
</COMPOSER>
<FOOTNOTE xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:type="simple"
xlink:href="footnote7.xml">7</FOOTNOTE>
<IMAGE xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:type="simple" xlink:href="logo.gif"
xlink:actuate="onLoad" xlink:show="embed"/>
В этом примере элементы имеют семантические имена, которые описывают их содержание, а не то, как они себя ведут. Информация о том, что эти элементы - связи, присутствует в атрибутах, но не в именах элементов. Атрибуты же определяют поведение связывания.
В самом первом элементе COMPOSER атрибут xlink:href определяет адресат связи. Значение атрибута - абсолютный URL http://www.users.interport.net/~beand/. Этот связующий элемент описывает соединение элемента COMPOSER текущего документа, содержание которого "Beth Anderson", с удаленным документом в http://www.users.interport.net/~beand/. Если бы мы включили этот элемент в документ XML и загрузили его в Web-браузер, поддерживающий XLink, как, например, Mozilla or Netscape 6, браузер подчеркнул бы эту связь, окрасив ее в синий цвет, и при нажатии на нее открыл страницу http://www.users.interport.net/~beand/.
Однако, данную ссылку можно интерпретировать более абстрактно: как просто определение однонаправленного соединения от одного ресурса, элемента COMPOSER, к другому ресурсу, Web-странице в http://www.users.interport.net/~beand/. На рисунке 1 показано это соединение. При этом оно на самом деле не подразумевает какой-либо особой семантики или поведения. Что эта абстрактная связь означает - решать приложению, которое читает этот документ.
В элементе FOOTNOTE значение атрибута xlink:href - это относительный URL footnote7.xml. Этот связующий элемент описывает соединение элемента FOOTNOTE текущего документа, содержание которого "7", с документом с именем footnote7.xml, находящемся на том же сервере, в том же каталоге, что и документ, в котором появляется эта связь.
Наконец, в третьем элементе IMAGE значение атрибута xlink:href - это относительный универсальный локатор ресурса logo.gif. И снова протокол, хост и каталог этого документа берется из протокола, хоста и каталога документа, в котором появляется эта связь. Однако, этот элемент требует немного отличного поведения. Вместо ожидания, пока пользователь активизирует связь, атрибут xlink:actuate просит, чтобы связь была активизирована автоматически, как только этот документ загрузится. Атрибут xlink:show требует, чтобы результат был встроен в текущий документ, а не заменял его.
Следующий подраздел посвящен этим двум атрибутам: xlink:actuate и xlink:show.
Как было сказано выше, связующие элементы могут включать два факультативных атрибута, которые предоставляют приложениям информацию о том, как связь ведет себя при активизации.
Атрибут xlink:show рекомендует, как следует отображать содержание, когда связь активизирована, например, должно ли открываться новое окно, чтобы показать адресуемое содержание, либо это содержание должно загружаеться непосредственно в текущее окно.
Атрибут xlink:actuate позволяет определить, когда активизировать связь, например, сразу после загрузки документа или исключительно после запроса пользователя.
Важно отметить, что хотя указанные поведения являются независимыми от приложений, программы могут игнорировать рекомендации этих атрибутов.
Атрибут xlink:show может принимать одно из следующих значений:
Если значение xlink:show равно replace, то при активизации связи (как правило, посредством щелчка мышкой по этой связи, по крайней мере, в GUI-браузерах) адресат связи заменяет текущий документ в том же самом окне. (Это поведение является действием по умолчанию для связей HTML.) Например:
<COMPOSER xlink:type="simple"
xlink:show="replace"
xlink:href="http://www.users.interport.net/~beand/">
Beth Anderson
</COMPOSER>
Если значение xlink:show равно new, то активизация связи вызывает открытие нового окна, в котором отображается адресуемый ресурс. Это похоже на поведение связей HTML, когда атрибуту target присвоено значение blank. Например:
<WEBSITE xlink:type="simple"
xlink:show="new"
xlink:href="http://www.quackwatch.com/">
Check this out, but don't leave our site completely!
</WEBSITE>
Если значение xlink:show равно embed, то при активизации связи адресуемый ресурс вставляется в существующий документ. Что именно это означает - зависит от приложения. Обычно предполагается, что приложение должно каким-то образом изобразить связываемое содержание и показать его как часть заключительного документа. В качестве примера приведем фрагмент кода, в котором этот атрибут используется для того, чтобы указать, что изображение JPEG должно быть встроено в этот документ:
<PHOTO xlink:type="simple"
xlink:href="images/nypride.jpg"
xlink:show="embed"
ALT="Marchers on 5th Avenue, June 2000"/>
Если значение xlink:show равно other, то предполагается, что приложение будет искать другую разметку в документе, которая объяснит, что делать. Как правило, это могло бы использоваться, чтобы отдельное приложение XML использовало другие, отличные от XLink элементы для описания поведения связи. Например, у многих Web-страниц в заголовке находится элемент LINK, который указывает таблицу стилей (style sheet) и может выглядеть следующим образом:
<LINK REL="stylesheet" TYPE="text/css"
HREF="http://www.w3.org/StyleSheets/TR/W3C-WD"/>
Это связь, но то, что находится в ее конце, не заменяет текущий документ, не встраивается в него и не отображается в новом окне. Для XML-документов вы могли бы условиться, что такое поведение предполагается всякий раз, как встречается элемент STYLESHEET. Поскольку это поведение не является ни одним из трех предопределённых поведений связей, необходимо присвоить xlink:show значение other.
<STYLESHEET xlink:show="other"
xlink:href="http://www.w3.org/StyleSheets/TR/W3C-WD"/>
Наконец, атрибуту xlink:show может быть присвоено значение none, чтобы показать, что документ не содержит никакой информации, которая могла бы помочь приложению решить, что, если уж на то пошло, делать со связью. В этом случае все зависит только от приложения.
Независимо от того, какое поведение атрибут xlink:show предлагает, браузер или иное приложение, читающее документ, при активизации связи может делать все, что угодно, в том числе и ничего. Например, браузер, у которого отключена автоматическая загрузка изображений, может решить проигнорировать xlink:show="embed".
Атрибут xlink:actuate может принимать одно из следующих значений:
Значение onRequest указывает, что связь должна обходиться только тогда, когда пользователь запросил ее и если он это сделал. (Это поведение обычной связи HTML.) Например, приведенная ниже связь выполняет переход в книжный магазин FatBrain только в том случае, если пользователь потребует это действие:
<PURCHASE xlink:type="simple" xlink:actuate="onRequest"
xlink:href="http://www.fatbrain.com/">
Buy from FatBrain
</PURCHASE>
С другой стороны, если атрибут xlink:actuate связующего элемента равен onLoad, эта связь прослеживается, как только загружен документ, содержащий эту связь. Например, вы можете установить этот атрибут, равным onLoad, чтобы изображение или другие части внешнего содержания были встроены в связывающий документ. В этом случае пользователю не нужно щелкать мышкой на связи, чтобы проследовать по ней. Такой код мог бы выглядеть следующим образом:
<IMAGE xlink:type="simple" xlink:href="logo.gif"
xlink:actuate="onLoad" xlink:show="embed"/>
Если значение xlink:actuate равно other, то приложение должно искать в документе другую разметку, не описанную с помощью XLink, чтобы решить, когда обходить эту связь. Например, браузер мог бы определить элемент PRELOAD, как указание на то, что на этой странице документ или изображение пока не применяются, но скоро, вероятно, будут использоваться.
<PRELOAD xlink:type="simple" xlink:href="logo.gif"
xlink:actuate="other" xlink:show="none"/>
Следовательно, если браузер располагает дополнительной доступной пропускной способностью, он должен, пока пользователь читает эту страницу, загрузить документ и кэшировать его. В противном случае, приложение будет ожидать, пока пользователь не активизирует связь.
Приложения, которые не распознают элемент PRELOAD, будут просто игнорировать его. (Необходимо помнить, что это исключительно теоретический пример!)
Наконец, присвоение атрибуту xlink:actuate значения none, означает, что приложение будет самостоятельно решать, обходить ли и, если да, то когда обходить эту связь.
Связующий элемент также включает факультативные атрибуты xlink:role и xlink:title, которые описывают удаленный ресурс: документ или другой ресурс, на который указывает эта связь. Атрибут xlink:title содержит простой текст, который характеризует этот ресурс. Атрибут xlink:role содержит URI, указывающий на документ, который более подробно описывает ресурс. Например, атрибут xlink:title может определять, что страница делает, а атрибут xlink:role может указывать на справочную страницу для этой страницы:
<SEARCH xlink:type="simple"
xlink:href="http://www.google.com/advanced_search"
xlink:title="Search with Google"
xlink:role="http://www.google.com/help.html">
Search the Web with Google
</SEARCH>
И xlink:role и xlink:title описывают удаленный ресурс, а не локальный элемент. Удаленный ресурс в этом примере - это документ в http://www.google.com/advanced_search. Не является исключением, хотя вовсе не обязательно, если содержание xlink:title будет таким же, как и у элемента TITLE страницы, с которой вы связываетесь.
Необходимо помнить, что XLink не определяет интерфейса, посредством которого атрибуты xlink:role и xlink:title представляются пользователю. Как и будет ли приложение применять эти атрибуты, целиком и полностью зависит от самого приложения.