Язык XML указателей XML Pointer Language (XPointer) Язык XPointer • Язык XPointer является языком XML указателей и предназначен для задания местонахождения точек и интервалов в XML документах. • Язык XPointer имеет синтаксис отличный от XML синтаксиса. • Выражения XPointer присоединяется к концу URI как идентификатор фрагмента и указывает на определенную часть XML-документа, а не на весь документ. • Синтаксис XPointer основывается на синтаксисе языка XPath. • К четырем фундаментальным типам XPath – логический, – набор узлов, – числовой, – строковый, • XPointer добавляет точки и интервалы, а также функции для работы с этими типами. • Он также добавляет сокращенный синтаксис для особенно полезных и распространенных форм выражений XPath. Универсальные указатели местоположения ресурсов - URL • Обычно URL, идентифицирующий документ, выглядит следующим образом: http://java.sun.com:80/products/jndi/index.html. – Схема (в этом примере это http) указывает, какой протокол должно использовать приложение для загрузки документа. – DNS имя, java.sun.com:80, указывает, с какого хоста приложению следует загружать документ. DNS имя может также включать порт для соединения с этим хостом, а также используемые для этого имя пользователя и пароль. – путь, /products/jndi/index.html, указывает, какой файл и из какого каталога запрашивается с сервера. • Данный файл может и не быть реальным файлом в файловой системы web-сервера, но он должен быть HTML документом, который сервер умеет создавать и отправлять. Указатель на фрагмент документа • Некоторые URL могут включать идентификаторы фрагментов документа, указывающие на конкретную именованную гиперссылку (якорь) внутри документа, заданного путем в URL. • Символ «решетка» ‘#’ отделяет идентификаторы фрагментов документа от основной части URL. – Если добавить к предыдущему URL идентификатор фрагмента «download», он будет иметь следующий вид: http://java.sun.com:80/products/jndi/index.html#download Указатель на фрагмент документа (2) http://java.sun.com:80/products/jndi/index.html#download • Когда web-браузер проследует по данной ссылке, то он будет искать в полученном документе именованную гиперссылку (якорь), заданную после символа ‘#’. – В данном случае с именем «download», который выглядит так: <a name="download"></a> • После этого браузер выполнит прокрутку окна к позиции в документе, где найдена гиперссылка (якорь) с данным именем. Указатель на фрагмент документа (3) • Такая схема является достаточно простой, понятной и подходящей для потребностей языка HTML. • Однако у нее есть один серьезный недостаток: для ссылки на определенное место в документе требуется изменить документ и добавить в него именованную гиперссылку в то место, на которое нужно сослаться. Указатели XPointer • Язык XPointer позволяет устранить это ограничение, разрешив обозначать цель ссылки с помощью любых выражений XPath в качестве идентификаторов фрагментов. • Кроме этого, XPointer расширяет XPath, предоставляя операции для выбора определенных точек или интервалов XMLдокумента. • Эти точки и интервалы не обязательно совпадают с одним узлом или набором узлов XMLдокумента. – На пример, XPointer может описывать интервал текста, отмеченный мышью в редакторе. Указатели XPointer • Указатель XPointer это просто выражение XPath, чаще всего маршрут поиска, заключенный в скобки xpointer(). • Например: – – – – – – – – xpointer(/) xpointer(//first_name) xpointer(id('sec-intro')) xpointer(/people/person/name/first_name/text()) xpointer(//middle_initial[position()=1]/../first_name) xpointer(//profession[.="физик"]) xpointer(/child::people/child::person[@id<4000]) xpointer(/child::people/child::person/attribute::id) • Не все эти XPointer обязательно ссылаются на один элемент. В зависимости от документа, для которого вычисляется XPointer, он может указывать на ноль, один или более чем на один узел. • Чаще всего идентифицируемыми узлами являются элементы, однако это могут быть и узлы атрибутов, текстовые узлы, два новых типа узлов, которые отсутствуют в XPath и вводятся в XPointer: – точки и – интервалы • Если нет уверенности, что используемый указатель XPointer найдет что-либо, можно его продублировать дополнительным указателем. – Например, данный указатель ищет элементы first_name. – Если такие элементы не будут найдены, он будет искать элементы last_name: xpointer(//first_name)xpointer(//last_name) • Элементы last_name будут найдены только в том случае, если в документе нет элементов first_name. • Можно соединять вместе сколько угодно частей xpointer(). • Например, xpointer(//first_name)xpointer(//last_name)xpointer(//middle_initial) – – – – этот указатель сначала ищет элементы first_name. если он их не находит, то ищет элементы last_name. если он и их не находит, то ищет элементы middle_initial. если никакие элементы не найдены, то указатель возвращает пустой набор узлов: Никаких специальных символов разделителей или пробельных символов между отдельными частями xpointer() не требуется. XPointer в ссылках • На что именно указывает XPointer, зависит от документа, к которому он применяется. • Этот документ определяется URL, к которому присоединен XPointer. • Если вам требуется URL, который указывает на первый элемент name в документе http://www.ibiblio.org/xml/people.xml, то нужно записать: http://www.ibiblio.org/xml/people.xml#xpointer(//name[position()=1]) Запись недопустимых символов • Если XPointer использует символы, недопустимые в соответствии со спецификацией URI (символы < , >, или “), то эти символы следует заменять на ссылки. • Каждый недопустимый символ заменяется на знак процента, за которым следуют шестнадцатеричные значения каждого байта символа в кодировке Unicode UTF8. – Например: символ ‘<‘ будет записываться как %3C, символ ‘ " ‘ – как %22. • В HTML URL элемента a может содержать идентификатор фрагмента XPointer: <a href = "http://www.ibiblio.org/xml/people.xml#xpointer (//name[position( )=1])"> Имя человека </a> • Если браузер проследует по этой ссылке, он скорее всего загрузит весь документ с адреса http://www.ibiblio.org/xml/people.xml и осуществит прокрутку к началу первого элемента «name» в документе. • Однако ни один браузер пока не поддерживает XPointer, поэтому остается вопросом, что же в действительности должно произойти. • В некоторых ситуациях, возможно, имеет смысл показать только указанный в XPointer элемент или элементы, а не весь документ. • Так как XPath находит узлы только в корректном XML-документе, XPointer могут указывать лишь на содержимое XML-документов. • Их нельзя использовать для ссылки на некорректные (с точки зрения XML) HTML документы, простые текстовые файлы или другие не XML-документы. • Однако вполне допускается делать ссылки из HTML документов и передавать их любым способом, которым возможно передавать текст. Использование указатели XPointer в ссылках XLink. • Указатели XPointer часто используются в простых и расширенных ссылках XLink. • Например, следующая простая ссылка указывает на первый дочерний элемент book дочернего элемента bookcoll корневого элемента testament в документе с относительным URL ot.xml: <link xlink:type="simple xlink:href="ot.xml#xpointer(/testament/bookcoll/book[position()=1])"> Genesis </link> Использование указатели XPointer в ссылках XLink. • В расширенных ссылках XPointer помогает задать начальный и конечный ресурсы ребра. • Например, следующая расширенная ссылка XLink – устанавливает связь между последним элементом v в документе с относительным URL ot.xml и первым элементом v документа с относительным URL nt.xml. – затем она устанавливает связь между первым элементом v в nt.xml и последним элементом v в ot.xml: <link xlink:type="extended" xmlns:xlink="http://www.w3.org/1999/xlink"> <testament xlink:type="locator" xlink:label="ot" xlink:href="ot.xml#xpointer(//v[position()=last()])"/> <testament xlink:type="locator" xlink:label="nt" xlink:href="nt.xml#xpointer(//v[position()=1])" /> <next xlink:from="ot" xlink:to="nt"/> <previous xlink:from="nt" xlink:to="ot"/> </link> • Могут существовать чисто внутренние ссылки; они ссылаются из одного места в документе на другое место в том же документе. – Например, элемент «slide», содержит простые ссылки XLink, указывающие на предыдущий и следующий элементы slide: <slide xmlns:xlink="http://www.w3.org/1999/xlink"> <point>Acme Wonder Goo – это вкусная обсыпка для десерта!</point> <point>Acme Wonder Goo – это мощное средство для чистки полов!</point> <point>Это два продукта в одном!</point> <previous xlink:type="simple" xlink:href = "#xpointer( here()/ancestor::slide/preceding-sibling::slide[position()=1])"> Back </previous> <next xlink:type="simple" xlink:href = "#xpointer(here()/ancestor::slide/following-sibling::slide[position()=1])"> Back </next> </slide> • Функция here(), являющаяся расширением XPointer к XPath, указывает, что контекстным узлом будет тот узел XML-документа, в котором находится XPointer. В приведенном примере это узлы, имеющие атрибут xlink:href. Простые имена • XPointer предоставляет много удобных расширений XPath. • Простое имя (bare name) – одно из простейших расширений. • Простое имя XPointer аналогично именованной гиперссылке (якорю) в HTML; оно идентифицирует элемент по имени. • Однако для имени используется ID-атрибут, а не специальный элемент a с атрибутом name. • ID-атрибут – это атрибут, объявленный в DTD документа как принадлежащий к типу ID. – Он не обязательно должен иметь имя ID или id. • Простые имена не могут ссылаться на элементы документов, не имеющих DTD или XML Sckema, так как в таких документах не может быть атрибутов типа ID. • Для ссылки на простое имя допишите к URL обычный разделитель фрагмента, за которым следует ID элемента, на который выполняется ссылка. – Например, URL http://www.w3.org/TR/1999/REC-xpath-19991116.xml#NT-AbsoluteLocationPath ссылается на элемент в спецификации XPath 1.0, имеющий атрибут типа ID со значением, равным NT-AbsoluteLocationPath. Пример простой ссылки • • • Например, требуется создать ссылку на раздел «Motivation and Summary» в рекомендации «Namespaces in XML» («Пространства имен в XML») по адресу http://www.w3.org/TR/1999/REC-xml-names-19990114/xml-names.xml. Из анализа исходного кода документа видно, что в нем используется атрибут id со значением sec-intro и что этот атрибут объявлен в связанном с ним DTD как имеющий тип ID. Начальный тег раздела выглядит следующим образом: <div1 id='sec-intro'> Тогда, URL, указывающий на этот раздел, будет выглядеть так: http://www.w3.org/TR/1999/REC-xml-names-19990114/xmlnames.xml#xpointer(id('sec-intro')) • • Имеется удобное сокращение для XPointer, использующего выражение XPath с функцией id(). Для использования данного URL, не требуется заключать имя в xpointer(). Достаточно только значения ID. http://www.w3.org/TR/1999/REC-xml-names-19990114/xml-names.xml#sec-intro. Последовательности дочерних элементов • Многие XPointer двигаются исключительно по оси дочерних элементов, выбирая элементы по их положению относительно одноуровневых элементов; – Например, выражение xpointer(/child::*[position()=1]/child::*[position()=2]/child::*[position()=3]) – выбирает третий дочерний элемент второго дочернего элемента корневого элемента документа. • Поскольку эта ось очень часто используется, XPointer позволяет сократить этот синтаксис, указывая только номера дочерних элементов, разделенные косыми чертами. • Это сокращение называется последовательностью дочерних элементов. • Приведенный выше пример XPointer можно также переписать как последовательность дочерних элементов в более компактной форме – /1/2/3. • Последовательность дочерних элементов не требуется заключать в xpointer(), как обычные выражения XPath. Точки и интервалы • Простые имена и последовательности дочерних элементов XPath позволяют указывать только на целые узлы или наборы узлов. • Иногда требуется указ на что-либо отличное от узла, на пример, на третье слово второго абзаца или на год в атрибуте date, имеющем вид date=”01/03/1950”. • Для этой цели XPointer добавляет к синтаксису XPath точки и интервалы. – Точки это позиции внутри значений атрибутов, комментариев или инструкций обработки. – Интервал – это промежуток анализируемых символьных данных между двумя точками. Точки • Точки это позиции внутри значений атрибутов, комментариев или инструкций обработки. – Точки не могут находиться внутри ссылок на сущности, хотя могут быть в тексте замены сущности. • Точка задается ее узлом-контейнером и неотрицательным индексом внутри этого узла. – Если узел, такой как документ или узел элемента, содержит дочерние узлы, точки находятся по обеим сторонам каждого из его дочерних узлов. – Если узел, такой как комментарий, инструкция обработки, атрибут, пространство имен или текст, не содержит дочерних узлов, точки находятся по обеим сторонам каждого символа в строковом значении узла. • Для выбора точек из содержащего их набора узлов можно воспользоваться критерием узла point(). • Например, элемент «novel», имеет семь дочерних узлов: – три из которых являются узлами элементов и – четыре – текстовыми узлами, содержащими только пробельные символы. <novel copyright="public domain"> <title>Удивительный Волшебник Страны Оз</title> <author>Л. Фрэнк Баум</author> <year>1900</year> </novel> • Восемь точек с номерами от 0 до 7 располагаются непосредственно внутри элемента «novel», одна непосредственно после и одна непосредственно перед каждым тегом. • На рис. показаны эти точки. • Внутри дочернего текстового узла элемента <year>1900</year> • Имеются пять точек присутствуют – – – – – Точка 0 между <year> и 1 Точка 1 между 1 и 9 Точка 2 между 9 и 0 Точка 3 между 0 и 0 Точка 4 между 0 и <year> • Заметьте, что точки находятся между символами текста и не идентифицируют сами символы. • Точки не имеют никаких измерений. Они идентифицируют местоположение, но не имеют протяженности, даже в один символ. • Чтобы указать хотя бы на один символ, задайте интервал между двумя точками. • Однако, так как в XPath не существует оси точек, у этой возможности ограниченное применение. • Вместо этого XPointer добавляет к XPath две функции, start-point() и end-point(), позволяющие выбрать точку непосредственно перед узлом элемента или текстовым узлом или после него. – Например, данный указатель XPointer определяет точку непосредственно перед элементом title, то есть точку 1: xpointer(start-point(//title)) – Этот указатель XPointer указывает на точку, находящуюся непосредственно за тегом </author>: xpointer(end-point(//author)) • Если бы в документе было несколько элементов title и author, то эти функции выбрали бы несколько точек • Точки также могут указывать на позиции в узле текста, комментария, значения атрибута или инструкции обработки. • Вначале нужно создать с помощью функции string-range() интервал, начальную или конечную точку которого вы хотите выбрать. • Затем используйте функции start-point() и endpoint() для выбора нужной вам точки. • В любом случае позиция точки является индексом символа, следующего за ней в строковом значении узла. • Ранее отмечалось, что – значением узла комментария является текст комментария, – значением узла атрибута – значение атрибута, а – значением узла инструкции обработки являются данные инструкции обработки. • Например, требуется указать точку словом «предыдущую» в комментарии <!-- Вспомните предыдущую главу -->. Символ «п» – двенадцатый в строковом значении комментария. Поэтому точка, находящаяся непосредственно перед ним, имеет индекс 11. • Так же обстоит дело и с инструкциями обработки, с той лишь разницей, что не требуется подсчитывать символы цели инструкции обработки и последующие пробельные символы. – Например, требуется указать на точку между кавычкой " и буквой «n» в названии таблицы стилей "novel.css". – Кавычка " является 23-м символом данных, а символ «n» – 24-м. • В инструкциях обработки могут быть только псевдоатрибуты, поэтому нельзя использовать ось атрибутов для выбора «атрибута» "value" инструкции обработки xmlstylesheet или любой точки внутри него. • Однако это можно сделать для настоящих атрибутов, таких как copyright элемента novel в рассмотренном примере. • Всегда является ошибкой указание критерия узла point() на точку перед содержащим узлом (то есть использование отрицательного индекса) или на точку после содержащего узла. • Однако приложение, столкнувшееся с такой ошибкой, вольно поступить с ней по своему усмотрению. – Не требуется какое-либо определенное поведение. • В web-браузере может получиться нечто подобное переходу по ссылке, указывающей на несуществующий именованный якорь, то есть после загрузки документа будет показано его начало, а фрагмент идентификатора проигнорирован. Интервалы • Интервал – это промежуток анализируемых символьных данных между двумя точками. • Он может представлять как корректный, так и некорректный участок XML-кода. – Например, интервал может включать начальный тег элемента, но не включать его конечного тега. • Это делает интервалы подходящими для представления текста, который пользователь выделил с помощью мыши. • Интервалы создаются с помощью четырех функций, добавленных XPointer в XPath: – – – – range() range-inside() range-to() string-range() Функция range() • Функция range() берет в качестве аргумента выражение XPath, возвращающее набор узлов. • Для каждого узла из набора функция range() возвращает интервал, в точности покрывающий этот узел; – начальная точка интервала – это точка непосредственно перед узлом, – а конечная – непосредственно после узла. • Если узел является элементом, интервал начинается прямо перед начальным тегом элемента и заканчивается сразу после его конечного тега. Пример функции range() • Рассмотрим следующий XPointer выбор интервал, в точности покрывающий один элемент title: xpointer(range(//title)) – Если в документе присутствует более одного элемента title, возвращается по одному интервалу на каждый такой элемент. – Если в документе отсутствуют элементы title, функция не возвращает никакого интервала. Пример функции range() • Другой XPointer: xpointer(range(/novel/*)) • При использовании рассмотренного примера возвращается все интервалы, каждый из которых покрывает дочерние элементы корневого элемента novel. Функция range-inside() • Функция range-inside() принимает в качестве аргумента выражение XPath, возвращающее набор узлов. • Для каждого узла из набора она возвращает интервал, в точности покрывающий содержимое этого узла. • Для всех типов узлов, кроме узлов элементов, этот интервал совпадает с возвращаемым функцией range(). • Для узлов элементов этот интервал включает все, что находится внутри элемента, но не его начальные и конечные теги. Пример функции range-inside() • Например, указатель xpointer(range-inside(//title)) возвращает интервал, охватывающий текст Удивительный Волшебник Страны Оз, а не элемент <title>Удивительный Волшебник Страны Оз</title> Функция string-range() • Функция string-range() работает с текстом документа после удаления всей разметки. Теги игнорируются. • Функция string-range() принимает в качестве аргументов выражение XPath, задающее узлы, и строку для поиска в тексте этих узлов. • Она возвращает интервал, начинающийся с первого вхождения строки поиска и заключающий в себе найденную строку. • Поиск выполняется с учетом регистра. Функция string-range() • Например, следующий XPointer выдает интервалы для всех вхождений слова «Волшебник» в элементах title: xpointer(string-range(//title, "Волшебник")) • Можно также указать для функции значения смещения и длины, так что строка будет начинаться с определенного количества символов от начала и продолжаться на указанную длину. • Например, следующий XPointer выбирает в элементах title первые 12 символов после слова «Волшебник»: xpointer(string-range(//title, "Волшебник", 9, 12)) • Все символы для строкового диапазона берутся только из символьных данных документа, но не из разметки. Примеры задания интервалов • интервал между первым и четвертым узлами golfer: http://www.someURL.com/remoteDocument.xml#xpointe r(/golfers/golfer[1]/range-to(/golfers/golfer[4])) • все интервалы в контексте /golfers/golfer/name, которые содержат подстроку “Joe”: http://www.someURL.com/remoteDocument.xml# xpointer(string-range(/golfers/golfer/name, “Joe”)) Совместное использование языков XLink и XPointer Совместное использование языков XLink и XPointer • Связывание в XML разделено на две части: XLink и XPointer. • Языки XLink и XPointer определяют стандартный способ создания гиперссылок (hyperlinks) между XML документами. Это стандарты W3C. • Язык XLink – – – – XLink это сокращение для языка «XML Linking Language» XLink используется для задания гиперсвязей (hyperlinks) между XML документам; любой элемент в XML документе может вести себя, как связь (behave as a link); XLink поддерживает • простые связи (links) (как ссылки HTML) и • расширенные связи (для связывания между собой набора ресурсов) – С помощью XLink, связи могут быть описаны вне связанных файлов; • Язык XPointer – XPointer это сокращение для «XML Pointer Language»; – язык XPointer позволяет связям указывать на конкретные части XML документов; – XPointer использует XPath выражения для указания на место в XML документе. Синтаксис языка XLink • В языке HTML для ссылки на другой HTML документ используется элемент <a>, который задает гиперссылку. • Однако в XML документах такой способ ссылки между документами не используется. • В языке XML можно использовать любые имена, поэтому процессор, обрабатывающий XML документ, например, браузер, не знает, какой элемент задает ссылку на другие документы. • The solution for creating links in XML documents was to put a marker on elements that should act as hyperlinks. • Для получения доступа к атрибутам и возможностям языка XLink необходимо в начале документа объявить пространство имен XLink: "http://www.w3.org/1999/xlink". • Атрибуты xlink:type и xlink:href attributes в элементах <homepage> определяют, что атрибуты type и href берутся из пространства имен xlink. • Простой пример того, как можно использовать XLink, для создания ссылок в XML документе: <?xml version="1.0"?> <homepages xmlns:xlink=http://www.w3.org/1999/xlink> <homepage xlink:type="simple“ xlink:href="http://www.w3schools.com">Visit W3Schools</homepage> <homepage xlink:type="simple“ xlink:href="http://www.w3.org">Visit W3C</homepage> </homepages> • Значение атрибута xlink:type="simple" говорит о том, что создается простая, ссылка между двумя документами (two-ended link) (значит, при щелчке по данной ссылке м.б. выполнен переход к заданному документу). • Кроме простых ссылок могут быть множественные ссылки (multi-ended, multidirectional) ссылки, которые будут рассмотрены позже.