Document 5009995

advertisement
Язык 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) ссылки, которые будут рассмотрены позже.
Download