Технология Идентификации Ресурсов X-Pointer Предназначение • X-Pointer – это язык, описывающий местонахождение тех или иных ресурсов. • Выражения языка X-Pointer позволяют создавать так называемые URI – которые отслеживают целостность ссылок, т.к. они они могут адресовываться не только на внешние документы, но и на части какого-либо документа, путем создания некоторой иерархической структуры выражения. Например, можно указать ссылку на конкретное слово, значение атрибута XMLдокумента. Основные Правила • Ссылки на языке X-Pointer могут указывать только на XML-документы, т.е. имеющие расширения : text/xml application/xml. • Все выражения X-Pointer записываются при помощи символов Unicode, если символов не хватает можно использовать Escapeпоследовательности (общения принтера и компьютера), но это практически исключено. Основные термины • Субресурс (sub-resource)-Часть целого XML-ресурса, такая как отдельная глава или абзац. Основная единица адресации языка X-Pointer. • Набор Указателей (location-set) – упорядоченный список точек адресации XML – документа, в который входят все адресуемые субресурсы различных типов. • Точка (pointer) – место в XML-документе, где конкретно расположен адресуемый субресурс. • Интервал (range) – часть содержимого XMLдокумента, размешенная между двумя точками, адресованными при помощи выражений X-Pointer. Ошибки языка X-Pointer: • Синтаксическая ошибка (syntax error) – выражение X-Pointer содержит конструкцию, не удовлетворяющее правилам оформления выражений X-Pointer. • Ошибка адресации (resource error) – синтаксически правильное выражение XPointer указывает на несуществующий XMLдокумент. • Ошибка адресации субресурса (subresource error) – все правильно, но отсутствуем указываемый субресурс. Абсолютные Указатели • • • • • • • • • • • • Пример XML-документа: <! DOCTYPE body [ <! ELEMENT p (#PCDATA)> <!ELEMENT group (item*)> <!ATTLIST p Id ID #REQUIRED> ]> ………………………………. <body> <p id=’p1’>First paragraph</p> <p id=’p2’>Second paragraph</p> </body> Будем считать что URL этого XML-файла : http://www.site.com/xml/f1.xml • Ключевое слово root указывает на точку местонахождения открывающего тега самого главного элемента, кот. Объявлен как тип документа (DOCTYPE) <hlink xlink:href=http://www.site.com/xml/f1.xml#root() /hlink> В этой строке мы указываем уже не на URL XMLдокумента, а URI некоторого субресурса. Перед выражением X-Pointer ставится знак #. Будет загружен документ из файла f1.xml , а фокус передан на открывающийся тег <body>, т.к он является корневым для нашего документа. • Конструкция ID (name) позволяет адресовать элемент в XMLдокументе, у кот. значение атрибута id установлено в name. <hlink xlink:href=”http://www.site.com/xml/f1.xml#ID(p1)”> Link on first paragraph</hlink> Установили ссылку на 1 параграф с содержимым First Paragraph. • Ключевое слово here является указателем на текущее положение самого указателя, т.е. отсчет будет вестись от самой ссылки, адресовать можно только те субресурсы, кот. находятся в том же XML-документе что и сама ссылка. <hlink xlink:href=”http://www.site.com/xml/f1.xml#here()”> Link </hlink> Указатель на указатель. Сам по себе бесполезен, используется в качестве основы для относительной адресации. Относительная адресация. • • • • • • • • • • • • • • • • • • • • Пример: <! DOCTYPE body [ <! ELEMENT list (item*)> <!ELEMENT item (#PCDATA|part)> <!ELEMENT part (#PCDATA)> <!ATTLIST item Id ID #REQUIRED> <!ATTLIST part Id ID #REQUIRED> ]> ………………………………. <body> <list id=’l1’> <item id=’i1’> <part id=’p1’>Part 1</part> <part id=’p2’>Part 2</part> </item> <item id=’i2’>Second item</item> </list> </body> • Ключевое слово Child позволяет адресовать все дочерние элементы источника, на кот мы указали при помощи абсолютной адресации, при этом адресуется только потомки находящиеся на 1 уровень ниже. <hlink xlink:href=”http://www.site.com/xml/f1.xml #root().child(2)”>Link to second item </hlink> Указывает на элемент item c идентификатором i2. • Для адресации всех потомков начального элемента используется descendant .При перемещении относительно ключевого элемента мы уже не учитываем иерархию потомков, а просто обходим содержимое и используем только порядковый номер Обратимся к одному и тому же элементу : part с индентификатором p2 <hlink xlink:href=”http://www.site.com/xml/f1.xml#root().child(1).child(2)”> Link to part 2 </hlink> <hlink xlink:href=”http://www.site.com/xml/f1.xml#root().decsedant(4)”> Link to part 2 </hlink> <hlink xlink:href=”http://www.site.com/xml/f1.xml#root().Id(i1).child(2)”> Link to part 2 </hlink> - сначала установили абсолютный указатель на Эл. Item с идентификатором i1, а уж от него движемся к искомому элементу part • Ancestor – если надо пройти вверх по иерархии объектов вверх от ключевого элемента к его предкам <hlink xlink:href=”http://www.site.com/xml/f1.xml#root().Id(p2).ancestor(3)”> Link to root </hlink> Двигаемся от самого глубокого элемента part к элементу body. • Ключевое слово psibling используется для указания на «предшествующих братьев», т.е. на элементы, у которых родитель совпадает с родителем исходного элемента и которые в содержимом XML-документа находятся после адресуемого элемента. Fsibling – позволяет адресовать «последующих братьев» <hlink xlink:href=”http://www.site.com/xml/f1.xml#Id(p1).fsibling(1)”> Link to part 2 </hlink> Переход от экземпляра документа с идентификатором p1 к экземпляру с идентификатором p2. <hlink xlink:href=”http://www.site.com/xml/f1.xml#Id(p2).psibling(1)”> Link to part 1 </hlink> Переход от экземпляра документа с идентификатором p2 к экземпляру с идентификатором p1. • • Following – если нас не интересует иерархическая зависимость элементов друг от друга, и мы хотим просто по содержимому XML-документа и просчитать то или иное количество экземпляров вниз. <hlink xlink:href=”http://www.site.com/xml/f1.xml #root().following(4)”>Link to part 2 </hlink> Для установки гиперссылки на элемент с идентификатором i2. • Preceding – для смещения вверх по содержимому XMLдокумента от начального элемента поиска <hlink xlink:href=”http://www.site.com/xml/f1.xml #Id(i1).preceding(1)”>Link to part 2 </hlink> Установим абсолютный указатель на элемент, близкий к концу документа, двинемся вверх по направлению к part 2. Адресация интервалов • Мы можем адресовываться не только на единичные элементы, но и на целые фрагменты XML- документа, т.к. они тоже являются субресурсами. Ссылка на фрагмент производится при помощи 2 выражений X-Pointer, при этом возвращается блок, находящийся между двумя точками, на которые указывают выражения X-Pointer.Первое выражение должно адресовывать элемент, находящийися ближе к началу документа, иначе сообщение об ошибке. • Range-to – создание ссылки на ресурс интервального типа <hlink xlink:href=”http://www.site.com/xml/f1.xml #Id(“chap1”)/range to (Id(“chap1”))”>Link to chapter 1 </hlink> Ссылка на фрагмент документа который находится между элементами с идентификаторами chap 1 и chap2. Адресация строчных субресурсов Это механизм текстового поиска в документе. Адресация осуществляется при помощи функции string – range. • String-range(//title,”Thomas Pynchon”)[17] Ищем 17-ое вхождение элемента типа title, значение которого равно Thomas Pynchon • String-range(//title,”Thomas Pynchon”, 8,4) При успехе поиска функция возвратит точку адресации подстроки “Pync”,которая начинается с 8 символа строки поиска и содержит 4 символа.Можем получить несколько подстрок. • String-range(String-range(//P,”Thomas Pynchon”)[17],”P”, 1,0) В качестве базы поиска передаются результаты первичного поиска – 17-ый экземпляр элемента P, который содержит строку Thomas Pynchon ; уточняющий поиск – найти символ P, от которого мы возьмем подстроку, начинающуюся с этого символа и не содержащую ни одного символа.