Цели статьи
Обосновав необходимость использования XSLT в вычислениях для финансовых отчетов, автор предлагает рассмотреть шаги, с помощью которых формулы схемы превращаются в XSLT-файл, где каждой формуле ставится в соответствие определенная XSLT-функция. С помощью этих функций из исходных данных вычисляются требуемые показатели. На упрощенном примере будут показаны необходимые компоненты. Затем задача будет усложнена, поскольку всегда существует необходимость работы с пропущенными данными. И в заключение автор намеревается обсудить производительность вычислительного XSLT, опираясь на собственный опыт использования сотен формул применительно к тысячам отчетов.
Хотя в практическом примере можно было использовать XBRL-схемы, базы связей и реальные документы, автор предпочел объединить и сократить XBRL-схему и базу связей формул в единую псевдо-схему, которая включает элементы как исходных, так и вычисленных данных (с формулами). Это было сделано для краткости и исключения ненужных деталей, чтобы можно было сосредоточиться на главном. Единственным элементом контекста этого упрощенного реального документа является период.
Первоначально эта работа была выполнена с использованием XSLT 1.0. Затем автор переделал ее с помощью версии XSLT 2.0 для того, чтобы изучить возможности поддержки последовательностей XPath 2.0, неограниченных структур данных и регулярных выражений (Regular Expressions) во второй версии XSLT. Ссылки на XSLT-функции должны рассматриваться как функции XSLT2.0, шаблоны XSLT 1.0 (или 2.0) или функции XQuery 1.0.
Финансовые отчеты: структура и данные
Элементы финансового отчета (например, оборотные фонды и основные средства) имеют определенные наименования, смысл которых не меняется в рамках используемого бухгалтерского стандарта (например, US-GAAP - generally accepted accounting principles (общепринятые принципы бухгалтерского учета)). XBRL определяет элементы с помощью XML-схемы и баз связей, которые опираются на спецификацию XLink (XML Linking Language - язык связей XML). Схема определяет элементы и их типы, а базы связей содержат дополнительную информацию. Например, если схема определяет элемент по его идентификационному коду (ID), то презентационная база связей связывает этот ID с принятым наименованием для окончательного представления. После общего определения элементов в реальном документе передаются конкретные значения, соответствующие той или иной компании в определенный момент времени. В реальном документе в формате XBRL такой момент времени и имя компании, соответствующие значению элемента, называются контекстом значения элемента.
Формулы
Специалисты по финансовым данным разрабатывают определенные формулы. Они также должны задать логику работы с пропущенными данными и другими возникающими затруднениями. Без этой логики значения формулы не могут быть вычислены надлежащим образом. Формулы используются для проверки достоверности данных и их анализа. Существует множество языков формул (разработанных самими компаниями для своих нужд или сторонними организациями), которые используются при работе с финансовыми данными. Но у них у всех существует общая основа, как следует из документа XBRL Formula Requirements (Требования к формулам XBRL). В этом документе проведен анализ требований и на конкретных примерах демонстрируется, как может работать предлагаемый язык формул. Эти формулы находятся в вычислительных базах связей.
Логика работы с отсутствующими данными
Ниже перечислены основные положения этой логики, при условии, что формулы ограничены вышеназванными типами. В случае численных расчетов значение отсутствующего аргумента принимается равным нулю. Читателю не обязательно концентрироваться на деталях, но стоит обратить внимание на возрастающую сложность.
В случае простого типа, если любой аргумент связан с предыдущим периодом и его значение отсутствует, формула не выдает ответа независимо от остальных правил.
В случае простого типа, содержащего выражение
null_eval_rule='null_if_all_null', формула выдает численный ответ при условии, что есть хотя бы один аргумент, значение которого известно. В противном случае формула возвращает нулевое значение.
В случае простого типа, содержащего выражение
null_eval_rule='null_if_any_null', формула не выдает ответа при условии, что есть хотя бы один аргумент, значение которого неизвестно. В противном случае формула выдает численный ответ.
В случае элемента типа "отношение" числитель и знаменатель вычисляются как отдельные формулы простого типа, имеющие общий элемент null_eval_rule. Если любой из них выдает пустое значение, то оно присваивается и всей формуле, в противном случае она вычисляется.
В случае элемента условного типа, выражения
test_left_hand и test_right_hand вычисляются как отдельные формулы простого типа, имеющие общий элемент null_eval_rule. Если только одно из них имеет пустое значение, а оператором является
eq (равно) или ne (не равно), результат теста вычисляется как true operator false (истинно оператор ложно); в противном случае любое пустое значение этих выражений рассматривается как равное нулю, и они сравниваются между собой как величины. После оценки теста как истинного или ложного общая формула выдает выражение formula_if_true или
formula_if_false, которые рассматриваются как формулы простого типа.
Насколько успешно вычислительный XSLT справляется с реальными финансовыми отчетами?
Как уже объяснялось, скорость стадии компиляции не является критической, но надо иметь в виду, что даже при правилах, более сложных, чем изложенные выше, сотни формульных функций создаются приблизительно в течение 10 секунд. Для компилятора гораздо важнее создать быстрый XSLT. XSLT-индексы (использующие <xsl:key>) существенно меняют дело, как, собственно, любое кэширование вызывов функций в XSLT-процессоре. Например, функция может вызываться 50 раз с одними и теми же аргументами. Если результат первого вызова кэширован, следующие 49 вызовов считываются из кэша. Парсер Saxonica 8.1, используемый в данном случае, поддерживает кэширование.
Пакет из 8000 реальных документов в формате XML (один документ - одна компания), каждый из которых содержал данные для 170 элементов ввода за 15 периодов, был преобразован в 8000 файлов с 336 вычисленными элементами для тех же периодов. Некоторые формулы обращались к вычисленным элементам, формулы которых, в свою очередь, также обращались к вычисленным элементам, и так вплоть до семи уровней обращения к исходным данным. Вычисление отсутствующих данных и правила регулирования периодов были более сложными, чем обсуждаемые в настоящей статье; также применялись пересчет в годовое исчисление и форматирование. Сорок пять миллионов вычислений были сделаны в течение семи часов, что хорошо соответствует ожиданиям автора и сопоставимо с другими способами обработки. Условия были следующими. Программное обеспечение: файлы Saxonica 8.1 JAR были встроены в облегченное приложение Java 1.4; JVM (Java Virtual Machine - виртуальная машина Java) работала в среде Windows 2000. Оборудование: персональный компьютер с процессором 3GHz и тремя гигабайтами оперативной памяти.
Применение логики работы с отсутствующими данными
После преобразования измененной схемы
schema_complex.xml результирующий файл
functions_complex.xslt (листинг 8) имеет много новых элементов для поддержки логики работы с отсутствующими данными. Во-первых, тип Xschema, выданный формульной функцией, меняется с xs:double на xs:double?. Последний допускает пустую последовательность - аналог пустого значения в XPath 2.0. Во-вторых, добавляется специальный код, который помогает присвоить "пустой" статус каждому аргументу и применять правило(а), позволяющие получить результирующий "пустой" статус всей функции. В файл functions_complex.xslt добавлены соответствующие комментарии.
Все это может выглядеть слишком сложным, но любой язык определения формул должен задавать логику их вычисления в таком формате, который обрабатывающее приложение способно проанализировать и применить и который должен быть доступен для чтения. Например, документ XBRL Formula Requirements признает необходимость гибкого кодирования такой логики и предлагает использовать для этого подмножество ECMAScript или XPath 1.0. Обрабатывающее приложение затем осуществит компиляцию этого скрипта в свой выполняемый код. Но в рассматриваемом случае чистого XSLT-подхода формульная функция в файле functions_complex.xslt просто использует вспомогательные функции и некоторые дополнительные коды, находящиеся в том же файле, для применения вычислительной логики.
Публикации
www.xbrl.org.
2. Требования к формулам XBRL. Общедоступный рабочий вариант, принятый 20 апреля 2004 г. (XBRL Formula Requirements, Public Working DRAFT of Tuesday, 20 April 2004). Доступен по адресу
www.xbrl.org/technical/requirements/Formula-Req-PWD-2004-04-20.pdf.
Примечания:
1 Значение атрибута name у этих элементов соответствует значению атрибута id в schema.xml (прим. пер.)
document.write('');
Новости мира IT:
02.08 - 02.08 - 02.08 - 02.08 - 02.08 - 01.08 - 01.08 - 01.08 - 01.08 - 01.08 - 01.08 - 01.08 - 01.08 - 01.08 - 01.08 - 31.07 - 31.07 - 31.07 - 31.07 - 31.07 -
Архив новостей
(66)
2 Август, 17:53
(19)
2 Август, 17:51
(34)
2 Август, 15:40
(42)
2 Август, 15:35
(1)
2 Август, 14:54
(3)
2 Август, 14:34
(3)
2 Август, 14:15
(2)
2 Август, 13:34
(7)
2 Август, 13:04
(3)
2 Август, 12:28
BrainBoard.ru
Море работы для программистов, сисадминов, вебмастеров.
Иди и выбирай!
google.load('search', '1', {language : 'ru'}); google.setOnLoadCallback(function() { var customSearchControl = new google.search.CustomSearchControl('018117224161927867877:xbac02ystjy'); customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET); customSearchControl.draw('cse'); }, true);
IT-консалтинг | Software Engineering | Программирование | СУБД | Безопасность | Internet | Сети | Операционные системы | Hardware |
PR-акции, размещение рекламы — , тел. +7 495 6608306, ICQ 232284597 | Пресс-релизы — |
This Web server launched on February 24, 1997 Copyright © 1997-2000 CIT, © 2001-2009 |
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. |
zyb-servise.ru советы и |
Работа с пропущенными (несуществующими) данными
Иногда данные оказываются недоступными (несуществующими) для исходных элементов: либо потому, что компания не сообщила их, либо из-за того, что формуле требуются исходные данные предыдущего периода, которых нет (такое, например, неизбежно случается, если требуются данные для периода, предшествующего самому раннему из тех, для которых есть данные). Специалистам по финансовым данным необходимо решить, как их формулы должны обращаться с отсутствующими данными. Например, логика операций с отсутствующими данными должна однозначно определять результат следующих выражений: 10 + null; null + null; 10 div null; null div 10; if (null ne 10) then (null + 20) else (30); if (25 gt null) ..; if(null = null).., и т.д...
В оставшейся части статьи автор использует бизнес-логику вычисления формул, принятую в его организации. Бизнес-логика других организаций может отличаться, но техническая обработка должна быть такой же.
Практический опыт показывает, что формулы должны иметь определенный тип (см. ниже), и для каждого типа существует ограниченное количество допустимых выражений. Эти ограничения необходимы, если должна применяться логика обработки отсутствующих данных. Измененная схема -
schema_complex.xml (листинг 7) - имеет элементы следующих четырех типов:
Тип исходных данных (Input type). Данные присваиваются элементам этого типа в документе в формате XBRL.
Простой тип вычислений (Simple calculation type). Слово "простой" означает, что в этом типе отсутствуют операторы сравнения, а ответом формулы должно быть число.
Отношение (Ratio). Имеет форму числителя (numerator) и
знаменателя (denominator), причем
числитель и знаменатель рассматриваются как под-формулы, имеющие простой тип или тип ввода.
Условный (Conditional). Имеет форму если (значение теста истинно), то вычислять результат по операции formula_if_true, иначе - по операции formula_if_false [if (test is true) then return result from formula_if_true else return from formula_if_false]. Тест имеет следующую форму:
(test_left_hand test_operator test_right_hand). Под-формулы test_left_hand, test_right_hand, formula_if_true и formula_if_false имеют простой тип или тип ввода.
Каждый элемент вычисляемого типа также имеет атрибут
null_eval_rule, который указывает, как вычислять формулу или под-формулу простого типа в условном типе или типе "отношение".
Расширяемый язык преобразования таблиц стилей: вычислительные возможности для финансовых отчетов
Эдмунд Джимзевски (Edmund Gimzewski)
Перевод: Intersoft Lab
Структурные языки, подобные XBRL (Extensible Business Reporting Language - расширяемый язык бизнес-отчетности), могут определять структуру финансового отчета, а сами данные могут быть сохранены как реальный XML-документ. Часто данные подвергаются дальнейшей обработке с помощью формул, например, для проверки балансов и получения информации для финансового анализа. Такая обработка обычно производится в приложениях, не имеющих отношения к XML, но у людей, работающих с XML, возникает вопрос: а насколько хорошо язык XSLT (Extensible Stylesheet Transformation Language - расширяемый язык преобразования таблиц стилей) мог бы справиться с данными вычислениями, и какие преимущества это дает? Использование XSLT для создания данных позволяет говорить о появлении вычислительного XSLT (Computational XSLT); этот язык открывает возможности для распространения финансовых формул в виде набора соответствующих функций XSLT, которые могут быть прочитаны и выполнены на любом процессоре XSLT. Автор статьи предлагает не новый стандарт, а новую роль для языка XSLT любой версии (1.0 или 2.0) или языка XQuery1.0 (XML Query Language - язык запросов XML), при этом могут использоваться данные как в формате XBRL, так и в любом другом XML-формате.
Создание XSLT из формул
Ниже приводится список компонентов, необходимых для создания XSLT-функций из формул схемы. Список состоит из файлов с "говорящими" именами. Файлы примеров представлены в виде исходных кодов и будут обсуждаться чуть дальше, а ниже объясняется их роль.
Файл Schema.xml определяет структуру финансового отчета в терминах исходных и вычисленных элементов. Вычисленный элемент включает использованную формулу; эта формула ссылается на другие элементы схемы (исходные или вычисленные).
В файле Instance.xml исходным элементам, определенным в файле schema.xml, присваиваются конкретные данные. Данные элемента - это одно или более значений, каждое со своим контекстом (периодом). Этот файл также содержит контексты.
Файл Compiler.xslt пишется вручную. Он преобразует формулы файла schema.xml в XSLT-файл с именем functions.xslt, где каждая формула становится эквивалентной XSLT-функцией. Файл назван компилятором (compiler), потому что можно провести аналогию с разбором файла schema.xml и генерацией эквивалентных вызываемых XSLT-функций. В результате, каждый файл schema.xml будет компилирован в эквивалентный файл functions.xslt.
Для того чтобы применить формулы, конечному пользователю нужно, чтобы из файла schema.xml создавался совместимый с ним файл instance.xml, а также файл functions.xslt. Функции этих файлов будут вызываться из их собственных XSLT. В исходных кодах файла host.xslt показывается, как используются функции файла functions.xslt.
Взаимодействие этих компонентов показано на рис. 1, который демонстрирует, что XSLT имеет две четко выраженные роли во всем процессе: он используется для компиляции при создании файла functions.xslt, а также для численных расчетов при последующем использовании этого файла. Компиляция должна повторяться после любых изменений в формуле и обычно не имеет временных ограничений. Однако, осуществление численных расчетов, которые могут выполняться в приложении для браузера, персонального компьютера или сервера, должно быть максимально производительным.
Рис.1. Две роли XSLT: создание и вызов функций
Пример: упрощенное использование вычислительного XSLT 2.0
Упрощение заключается в том, что пропущенные (несуществующие) данные рассматриваются как данные, значение которых равно нулю. Файл schema.xml (листинг 1) имеет три исходных элемента и четыре вычисленных. После преобразования в файл functions.xslt (листинг 2) вычисленный элемент становится элементом <xsl:function> с тем же именем. В файле
functions.xslt префикс пространства имен formula используется для этих функций, автоматически генерируемых из формул, для того, чтобы отличать их от фиксированных вспомогательных функций (пространство имен helper), которые они вызывают (см. ниже). Предполагается, что исходные данные в файле instance.xml (листинг 3) - это данные для одной компании.
Структура формульной функции в файле functions.xslt проста: она имеет один параметр context_id, который является индикатором того периода отчета, который вычисляется из файла instance.xml. Она содержит XSLT-переменную для каждого аргумента в формуле элемента и выдает формулу, вычисленную по прописанной схеме. Например, выражение formula:F10 - это формульная функция для следующей операции: <item id="F10" formula="$F1 + $F2" type="calc"/>
Выражение formula:F10 содержит переменные $F1 и $F2, созданные следующим образом: <xsl:variable name="F1" select="helper:get_input_value ( 'F1', $context_id)" as="xs:double"/>
Соответственно, его результатом является: <xsl:sequence select="$F1 + $F2"/>
А вот более сложный пример: <item id="F13" formula="if( ($F10 - $F10_prev) gt 0.01*$F10_prev ) then ($F10 + $F3) else ($F10)" type="calc"/>
В соответствующей функции formula:F13 переменной вычисляемого элемента $F10 присваивается значение путем вызова формульной функции с идентичным именем, параметром которой является context_id: <xsl:variable name="F10" select="formula:F10( $context_id)" as="xs:double"/>
В определении элемента F13 модификатор _prev в выражении $F10_prev указывает, что значение должно относиться к предыдущему контексту. Такие ссылки часто встречаются в финансовых формулах. Соответствующая переменная в выражении formula:F13 создается следующим образом: <xsl:variable name="F10_prev" select="formula:F10(helper:get_ previous($context_id))" as="xs:double"/>
Здесь функция helper:get_previous(context_id) просто выдает значение context_id для периода в один год, предшествующего тому, который был указан.
Если обратиться к исходным кодам, то файл
compiler.xslt (листинг 4) использовался для создания файла functions.xslt из schema.xml; файл host.xslt (листинг 5) показывает, как вызываются функции в файле
functions.xslt; файл calculated_data.xml (листинг 6) показывает результат, который получается при преобразовании instance.xml с помощью файла
host.xslt.
Все эти задачи сравнительно простые, а формулы в файле functions.xslt обладают той же гибкостью, что и формулы XPath 2.0.
XSLT как приложение для обработки формул
При наличии исходных данных в формате XBRL или формате, определяемом какой-либо другой схемой, вычисления могут осуществляться с использованием формул, определенных в базах связей, с помощью XML или иных языков разметки. Приложение для обработки, которое выдает вычисленные данные, обычно работает по формулам, написанным не в скрипте XML. Но процессор XSLT является стандартизированным приложением, которое может преобразовать исходные данные в формате XML в вычисленные данные, используя инструкции, доступные для чтения и написанные на языке XSLT. Таким образом, для того, чтобы использовать возможность XSLT, необходимо восполнить одно пропущенное звено - преобразовать набор формул в XSLT-файл.
Такой файл затем предоставит возможность совместного использования реализации формул и логики их обработки, причем эта реализация будет доступна для чтения и выполнения на любой машине. Например, этот файл может быть предоставлен вместе с данными (исходными и вычисленными), чтобы продемонстрировать, как были получены результирующие данные. Пользователь также может применить эти формулы к своим собственным данным: в пакетном режиме на сервере или индивидуально с помощью браузера или приложений для персонального компьютера. Возможно, главное преимущество такого подхода заключается в том, что он предлагает сравнительно прямой путь для перехода от реляционных к вычисленным данным, при условии, что он используется вместе с поддержкой операций извлечения и трансформации (extract-and-transform), основанных на XML (с помощью XSLT), которую в настоящее время предлагает уже большинство поставщиков баз данных.
это серьезная возможность для применения
Вычислительный язык XSLT - это серьезная возможность для применения формул к данным финансовых отчетов. Файл в формате вычислительного XSLT может быть создан из определений формул и способен использовать достаточно сложную логику вычисления отсутствующих данных для того, чтобы применять эти формулы. XSLT-файл дает многим пользователям возможность использования доступных для чтения и пригодных для любой машины формул и логики их обработки. Например, такой файл может предоставляться вместе с данными (исходными и вычисленными) для того, чтобы показать пользователю, как вычисленные данные были получены, или дать ему возможность применить эти формулы к своим собственным данным. Хотя рассмотренный подход и не привязан к каким-либо стандартам, кроме XSLT (или XQuery 1.0), он может работать с XBRL-данными. Этот основанный на XML подход также предлагает прямой путь перехода от данных, находящихся в реляционных базах, к вычисленным данным, с помощью XML-поддержки операций извлечения и преобразования (основанных на XSLT), которая предоставляется основными поставщиками баз данных.
XQuery
В качестве языка запросов, применимого к источникам XML-данных разнообразных типов, Консорциум Всемирной Сети [2] позиционирует язык XQuery [5]. Хотя на момент написания настоящей статьи язык XQuery еще не был переведен из чернового статуса в статус официальной Рекомендации Консорциума, уже можно с уверенностью говорить о том, что в своей текущей версии XQuery не предоставляет средств по обработке ссылок языка XLink в соответствии со Спецификацией XLink, что подтверждается следующими соображениями:
Описания ссылок языка XLink строятся на сложном и многословном синтаксисе, базирующемся на пространстве имен и иерархической взаимосвязи элементов языка XLink. При написании на XQuery запросов к XML-документам, содержащим элементы языка XLink, вся работа по распознаванию ссылок XLink и интерпретации их семантики целиком ложится на разработчика запросов. Необходимо также заметить, что получение информации о дугах, описанных в единственной расширенной ссылке языка XLink, требует написания на XQuery нескольких операций естественного соединения (join), выполнение которых дает значительную нагрузку на вычислитель языка XQuery.
При соединении с помощью ссылки XLink удаленного ресурса, представляющего собой фрагмент некоторого XML-документа, идентификация данного фрагмента внутри документа осуществляется с помощью языка XPointer, и идентификатор фрагмента включается в значение одного из глобальных атрибутов языка XLink. При обработке ссылок XLink с помощью XQuery для определения ресурсов, соединяемых с помощью ссылки, необходимо динамически вычислить идентификатор фрагмента на языке XPointer, полученный в качестве значения атрибута. В Библиотеке базовых функций XQuery [11] не существует функции, позволяющей интерпретировать идентификатор фрагмента, записанный на языке XPointer. Автору также не известна ни одна реализация XQuery, которая бы предоставляла интерпретатор языка XPointer внутри вычислителя запросов.
Предлагаемый в настоящей статье язык запросов к совокупности XML-документов, связанных ссылками XLink, базируется на подмножестве XQuery - языке XPath, назначением которого является адресация структурных частей XML-документа. В настоящей статье предлагается расширение XPath высокоуровневой поддержкой XLink, функциональность языка запросов достигается благодаря возможности тесной интеграции XPath с функциональным языком программирования общего назначения Scheme.
/A> Браузеры с поддержкой XLink
Под поддержкой языка XLink браузером будем понимать способность браузера распознавать элементы языка XLink в XML-документе и обеспечивать пользовательский интерфейс для переходов между ресурсами по дугам XLink. Среди браузеров, обеспечивающих поддержку языка XLink, следует упомянуть такие, как Amaya, Mozilla и DocZilla. Первые два реализуют поддержку языка XLink лишь в масштабе простых ссылок XLink, браузер DocZilla обеспечивает также навигацию по расширенным ссылкам.
Наличие лишь одного известного автору браузера, поддерживающего ссылки языка XLink в полном объеме (DocZilla), мотивируется сформулированными Консорциумом Всемирной Сети требованиями к языку XLink[4]. В то время как простые ссылки XLink явным образом ориентированы на внешнее представление, презентационный аспект расширенных ссылок XLink многими аналитиками ставится под сомнение [12].
Необходимо заметить, что браузеры с поддержкой языка XLink по своей природе нацелены на наглядное представление документов со ссылками XLink человеку. Поскольку браузеры являются прикладным программным продуктом, при их разработке не ставятся задачи обеспечения других приложений средствами высокоуровневой обработки XML-документов со ссылками XLink. В настоящей статье решается системная задача, и язык запросов к совокупности XML-документов, связанных ссылками XLink, разрабатывается из расчета на то, чтобы быть использованным другими приложениями.
/A> Дуга XLink как слабоструктурированные данные
Для наглядности предлагаемого представления дуги XLink в виде информационной единицы в данном разделе для записи примера будет использоваться синтаксис XML. При этом необходимо отметить, что XML является не единственным синтаксисом для записи дуги XLink в виде информационной единицы: в частности, как будет показано в разделе 6, при реализации предложенного языка запросов XPathLink функциональными методами для представления дуги XLink использовался формат SXML [17]. В данном разделе мы будем оперировать терминами Информационного Пространства XML с целью подчеркнуть независимость предлагаемого представления дуги XLink от конкретного внешнего синтаксиса.
Каждой дуге XLink будет соответствовать информационная единица типа «элемент» (element information item).
С каждой дугой XLink сопоставим имя, которое будет содержаться в локальном имени информационной единицы, представляющей дугу. Имена дуг не представлены в явном виде в синтаксисе языка XLink и в настоящей статье предлагаются для удобной классификации дуг приложением. Наличие имени у дуги предоставляет приложению удобный способ выбрать группу дуг, обладающих общими свойствами, без необходимости проводить детальный анализ внутренней структуры информационных единиц. Предлагается сопоставлять с каждой дугой XLink одно из следующих 6 имен:
Дуге, определяемой простой ссылкой XLink, сопоставим имя simple (простая). Спецификация XLink определяет, что описание простой ссылки XLink содержит дугу неявным образом, и эта дуга обеспечивает переход от локального ресурса простой ссылки к ее удаленному ресурсу.
Дуге, определяемой внутри расширенной ссылки XLink, сопоставим одно из имен outbound (исходящая), inbound (входящая), third-party (сторонняя) или local-to-local (от локального к локальному), в зависимости от типа дуги. Определения первых трех типов дуг введены Спецификацией XLink и уже обсуждались в разделе 2. Спецификация XLink не предусматривает какого-либо специального названия для дуги, и исходный, и целевой ресурсы которой являются локальными, ввиду редкой практической потребности для дуги данного типа. Для полноты рассмотрения возможных вариантов определяемых внутри расширенной ссылки типов дуг, для дуги, соединяющей 2 локальных ресурса, выбрано имя local-to-local.
Дуге, семантическая роль которой состоит в указании на ссылочную базу (linkbase), сопоставим имя linkbase. Ссылочная база - это отдельный XML-документ, содержащий описания входящих и сторонних ссылок. Дуга, описанная как указывающая на ссылочную базу, позволяет приложению идентифицировать обрабатываемые ресурсы как исходные ресурсы для входящих и сторонних ссылок, которые описаны в ссылочной базе. По сравнению с остальными дугами, дуга, указывающая на ссылочную базу, должна обрабатываться особым образом: вместо перехода по дуге приложение должно загрузить ссылочную базу и извлечь описанные в ней ссылки для последующего использования. Для описания дуги как указывающей на ссылочную базу в языке XLink используется предопределенное значение глобального атрибута с семантикой роли дуги. При представлении дуги, указывающей на ссылочную базу, в виде информационной единицы предлагается иметь для такой дуги особое имя с целью облегчения ее обработки приложением.
Представляющая дугу XLink информационная единица типа «элемент» имеет дочерние информационные единицы, которые содержат необходимые данные о соединяемых дугой ресурсах и семантических параметрах дуги.
/A> Интерфейсы прикладного программирования
Интерфейсы прикладного программирования для обработки XML-документов, соединенных ссылками языка XLink, предоставляют системы XLip, X2X и ExtremeKnit. Все 3 обозначенные системы предоставляют интерфейсы прикладного программирования на языке объектно-ориентированного программирования Java.
Ввиду использования объектно-ориентированного языка программирования для обработки XML-документов, все 3 системы - XLip, X2X и ExtremeKnit - страдают от проблемы несоответствия импеданса [13]. Так, в интерфейсах прикладного программирования, предоставляемых каждой из рассматриваемых 3 систем, для представления и обработки XML-документов со ссылками XLink разработана своя собственная система классов, и каждая из этих систем классов достаточно далека от древовидной структуры Информационного Пространства XML [14].
Помимо показанной проблемы несоответствия импеданса, все 3 интерфейса прикладного программирования являются достаточно низкоуровневыми. С различными вариациями отдельные методы языка Java используются для таких базовых операций, как загрузка отдельного XML-документа, получения набора ссылок, нахождения исходного или целевого ресурса для данной ссылки и т.п. Упомянутые методы связаны друг с другом только по их аргументам и возвращаемым результатам, что вынуждает разработчиков приложений вводить много локальных переменных и прослеживать сложные взаимосвязи между классами языка Java. Приложению приходится проводить много низкоуровневой рутинной работы, прежде чем будут получены все необходимые данные для переходов по ссылкам XLink и обработки связанных этими ссылками XML-документов.
Язык запросов, предлагаемый в настоящей статье, обеспечивает более высокий уровень абстракции над синтаксисом языка XLink по сравнению с рассмотренными интерфейсами прикладного программирования. Использование функциональных методов программирования для сделанной реализации обеспечивает интеграцию предлагаемого языка запросов с языком программирования общего назначения Scheme на уровне узлов обрабатываемых документов (как списковых структур данных языка Scheme) и функций Scheme, что позволяет избежать проблемы несоответствия импеданса [15].
/A> Язык запросов
Тесная интегрированность SXPath с языком программирования общего назначения Scheme предоставляет функциональность языка запросов к SXML-документам.
Проводя аналогии с языком запросов к XML-документам XQuery, можно обозначить следующие соответствия между конструкциями XQuery и возможностями Scheme:
Итерация по членам последовательности for-return языка XQuery реализуется на Scheme функцией map. Функция map получает на вход функцию от одного аргумента и список, формируя новый список, последовательно применяя полученную в качестве аргумента функцию к каждому из членов аргумента-списка.Функции и операторы XQuery[11], а также функции XQuery, определяемые пользователем, реализуются на Scheme также функциями - стандартными, библиотечными или определяемыми пользователем. Дополнительно в языке Scheme функции могут использоваться как объекты первого класса, что не поддерживается в XQuery.Конструкторы различных типов узлов в языке XQuery реализуются на Scheme конструкторами списков. Более того, наличие в языке Scheme выражений квази-цитирования (quasiquote) и снятия цитирования (unquote) позволяет компактным и наглядным образом комбинировать константные выражения и фрагменты вычисляемых выражений. Аналогичные идеи используются в синтаксисе XSLT для комбинирования литеральных элементов результата [2] и исполняемых инструкций.
Рассмотрим совместное использование SXPath и Scheme как языка запросов к SXML-документам на конкретном примере.
Пример 8. Вновь обратимся к рисунку 1 и подведем счет для каждого сделанного заказа. Счет будет включать в себя имя клиента и общую цену с учетом количества единиц каждого заказанного товара.
Получение желаемого результата требует использования языка запросов, поскольку требуется не просто выбрать некоторые узлы из XML-документов, но также сконструировать новые узлы, которых в самих документах нет. На рис. 6 показано решение поставленного запроса в двух вариантах:
на языке XQuery, расширенном предлагаемыми в настоящей статье дополнительными осями XPath; на Scheme, благодаря тесной интеграции SXPath с языком программирования.
Рис. 6: Вычисление счета для каждого заказа: с помощью XQuery, расширенного поддержкой XLink, (вверху) и с помощью Scheme (внизу). См. также пример 8.
Из рис. 6 легко видеть, что соответствие между выражениями языка XQuery и вызовами функций языка Scheme является достаточно прямолинейным, и многие конструкции языка XQuery имеют свое наглядное отражение в виде примитивов языка Scheme над деревьями SXML-документов.
Результатом вычисления представленного на рис. 6 кода на Scheme является набор узлов, выражающих на SXML искомые счета для сделанных заказов: ((bill (total-price 1900) (name "John Smith")) (bill (total-price 20) (name "Paul Brown")))
/A>Обзор языка XLink
Язык ссылок XML (XML Linking Language, XLink)- это язык описания межресурсных связей с помощью XML и отдельного пространства имен.
На дизайн языка XLink в значительной степени повлияли следующие стандарты [1]:
Язык разметки гипертекстовых документов HTML, определяющий несколько типов элементов, которые представляют ссылки. Наиболее известным инструментом для определения межресурсных связей при создании гипертекстовых документов являются гиперссылки, задаваемые при помощи элемента A языка HTML, где под гиперссылкой понимается такой вид ссылки, основным назначением которой является представление человеку [1].
Язык описания межресурсных связей HyTime, обладающий более богатыми выразительными возможностями, нежели HTML, и позволяющий определять входящие и сторонние ссылки, а также описывать некоторые их семантические свойства.
Язык XLink обеспечивает полную функциональность гиперссылок HTML, и гораздо большее [7]: он позволяет устанавливать отношение связи между более чем двумя ресурсами, ассоциировать различные метаданные со ссылками, соединять ресурсы без их модификации [4].
Хотя ссылки XLink описываются на XML, с их помощью можно соединять не только XML-документы, но и другие виды ресурсов. Понятие ресурса определяется в IETF RFC 2396 как любая адресуемая единица информации или сервиса [8]. Если ресурс представляет собой правильно сформированный (well-formed) XML-документ, то спецификация XLink считает ресурсом также любую часть этого документа, определяемую идентификатором фрагмента на языке указателей XML (XML Pointer Language - XPointer) [9]. Идентификатор фрагмента языка XPointer может дополнять унифицированный идентификатор (URI) XML-документа.
Относительно конкретной ссылки Спецификация XLink подразделяет все ресурсы на локальные и удаленные. В терминах XLink, локальный ресурс - это элемент XML, который участвует в ссылке за счет того, что ссылочный элемент является для него родительским [10]. Ресурс, который участвует в ссылке благодаря тому, что к нему адресуются с помощью унифицированного идентификатора URI, считается удаленным (remote), даже если он располагается в том же XML-документе, что и ссылка, или даже внутри ссылочного элемента. Заметим, что один и тот же ресурс может быть локальным для одной ссылки XLink и удаленным - для другой.
Язык XLink вводит два типа ссылок.
Простая ссылка (simple link) - это ссылка, которая ассоциирует в точности два ресурса - один локальный и один удаленный - и определяет семантику перехода от первого ко второму. Предоставляемая простой ссылкой функциональность по связыванию ресурсов является наиболее распространенной (например, в эту же категорию попадают ссылки A и IMG языка HTML). Синтаксис простых ссылок ориентирован на краткость записи, и поэтому у простых ссылок нет какой-либо специальной внутренней структуры.
Использование простой ссылки иллюстрируется примером, показанным на рис. 1, который будет использоваться в ходе дальнейшего обсуждения в данной статье. Рисунок выражает систему заказа товаров некоторого электронного магазина. Будем считать, что электронный магазин оперирует такими ресурсами, как каталог товаров, информация о клиентах и сделанные клиентами заказы товаров из каталога. Поскольку обозначенные 3 ресурса имеют разнородную структуру, разумно хранить их в виде 3 отдельных XML-документов, каждый из которых показан на рис. 1. Простые ссылки XLink позволяют установить связь каждого конкретного заказа с элементами из каталога, которые были заказаны, и с клиентом, который сделал заказ.
Рис. 1: Набор связанных с помощью XLink XML-документов, выражающих систему заказа товаров.
Элемент языка XML, являющийся ссылкой XLink, может носить произвольное имя, а принадлежность элемента к языку XLink и ссылочный тип элемента устанавливаются глобальным атрибутом xlink:type, где префикс xlink связывается с пространством имен, зарезервированным языком XLink. По аналогии с гиперссылками HTML, удаленный ресурс, на который указывает простая ссылка XLink, определяется атрибутом xlink:href. Значением атрибута xlink:href служит Унифицированный Идентификатор URI, возможно, включающий в себя идентификатор фрагмента на языке XPointer - для целевых ресурсов, представляющих собой фрагмент XML-документа.
В документе "purchase-orders.xml" на рис. 1 простыми ссылками XLink являются элементы языка XML с именами item и customer; первые указывают на элементы каталога, вторые - на клиентов. Идентификация конкретного клиента осуществляется с использованием имеющихся в XML-документе
"clients.xml" атрибутов типа ID, и при данном способе идентификации может использоваться сокращенный синтаксис XPointer, напоминающий обращение к именованному якорю в HTML. Для идентификации элемента в каталоге (XML-документ "catalogue.xml") используется полный синтаксис XPointer. Из рассматриваемого примера легко видеть, что по сравнению с гиперссылками HTML простые ссылки XLink обладают более гибкими и мощными возможностями по связыванию ресурсов и описанию семантики этих связей.
Расширенная ссылка (extended link) - это ссылка, которая выражает полную функциональность языка XLink. Расширенная ссылка может объединять произвольное количество участвующих в ней ресурсов, и участвующие ресурсы могут быть любой комбинацией локальных и удаленных.
Использование или следование по ссылке с какой-либо целью называется
переходом (traversal). Несмотря на то, что расширенные ссылки могут соединять произвольное количество ресурсов, переход всегда включает в себя ровно 2 ресурса [1]. Информация о том, как осуществлять переход между парой ресурсов, включающая в себя направление перехода и его семантику, задается при помощи дуги (arc).
Ввиду того, что расширенная ссылка предоставляет мощные возможности по связыванию ресурсов, структура расширенной ссылки может быть достаточно сложной. В общем случае она включает в себя элементы типа локатор [2], которые указывают на удаленные ресурсы; элементы типа ресурс, содержащие локальные ресурсы; элементы типа дуга, которые определяют дуги и условия перехода по ним.
Дуга в языке XLink является ориентированной, и 2 ресурса, соединяемые дугой, называются соответственно исходным (starting resource) и
целевым (ending resource) [2]. Дугу называют входящей (inbound), если ее исходный ресурс является удаленным ресурсом, а целевой ресурс - локальным. Дуга называется сторонней (third-party), если ни один из соединяемых ею ресурсов не является локальным. Благодаря наличию в языке XLink входящих и сторонних дуг обеспечивается возможность соединять ресурсы без их модификации.
Обычно элементы типа "расширенная ссылка'' располагаются отдельно от тех ресурсов, которые они соединяют (например, в совершенно разных документах). Расширенные ссылки важны для ситуаций, когда соединяемые ресурсы доступны только для чтения; или когда модификация этих ресурсов является дорогостоящей и сложной операцией, тогда как модификация отдельно располагающейся ссылки достаточно проста; или когда ресурсы имеют форматы, не поддерживающие встроенные ссылки (как для многих мультимедийных форматов).
Пример расширенной ссылки будет рассмотрен в разделе 5.
Хотя простые ссылки концептуально являются подмножеством расширенных ссылок, они синтаксически различны. В частности, простая ссылка определяет дугу неявным образом, и поэтому для преобразования простой ссылки в расширенную ссылку требуется осуществить несколько структурных преобразований.
Можно говорить о том, что предназначением простой ссылки является удобная короткая форма записи для эквивалентного случая расширенной ссылки [1]. Один элемент вида «простая ссылка» объединяет в себе базовую функциональность элементов типа «расширенная ссылка», «локатор», «дуга» и «ресурс». В том случае, когда реально требуется лишь подмножество свойств этих элементов, простая ссылка удобна как альтернатива расширенной ссылке.
/A> Обзор SXML
SXML - это абстрактное синтаксическое дерево XML-документа в форме S-выражения. Языки SXML и XML могут рассматриваться как два синтаксически различных представления Информационного Пространства XML [14].
Язык XML использует язык разметки SGML для представления информационных единиц Информационного Пространства XML и их свойств. Древовидная структура документа (свойства родитель и ребенок информационных единиц Информационного Пространства XML) выражается при помощи вложенных тегов разметки [13].
Язык SXML использует для представления информационных единиц Информационного Пространства XML и их свойств S-выражения языка Scheme. Древовидная структура документа выражается при помощи вложенных списков. Каждая из информационных единиц Информационного Пространства XML представляется в виде S-выражения, первым членом которого является либо имя информационной единицы (для типов «элемент» и «атрибут»), либо служебное имя, предусмотренное для информационной единицы данного типа в грамматике SXML [17].
Пример простого XML-документа и его представления на SXML приведены на рис. 5, наглядно демонстрирующем соответствие между вложенными тегами XML и вложенными списками SXML.
Рис. 5: XML-документ (левый столбец) и его представление в SXML.
/A> Обзор XPath
Назначение языка XPath- адресация структурных частей XML-документа. Ввиду того, что XML-документ является, в сущности, древовидной структурой, модель данных языка XPath [6] представляет документ как дерево узлов.
Вычисление любого выражения XPath осуществляется относительно контекста. Основными составляющими контекста являются:
Узел XML-документа (называемый также контекстным узлом);
Контекстная позиция и контекстный размер, которые используются при определении взаимоотношения контекстного узла с остальными узлами.
Основной конструкцией языка XPath является путь доступа (location path) [6]. Путь доступа применяется к контекстному узлу, и результатом вычисления является набор узлов (node-set) [2], состоящий из (возможно, нескольких) узлов, выбранных с помощью данного пути доступа относительно контекстного узла. Выбранные узлы соответствуют элементам, атрибутам, текстовым данным и другим частям XML-документа [16].
Путь доступа состоит из последовательности одного или более шагов доступа (location step), синтаксически отделяемых друг от друга символом косой черты ("/''). Шаг доступа включает в себя 3 составляющие:
Ось (axis), определяющую соотношение в дереве между узлами, в контексте которых вычисляется шаг доступа, и узлами, которые выбирает шаг доступа. Ось можно считать "направлением движения'' по дереву, представляющему XML-документ [16]. Спецификация XPath определяет 13 различных осей. Они включают в себя оси для спуска к листьям дерева, для подъема в сторону корня, для выбора соседних узлов и т.п. Синтаксически имя оси отделяется от остальной части шага адресации с помощью двойного двоеточия ("::'').
Тест узла (node test), который определяет тип и, возможно, имя узлов, выбираемых шагом доступа. В то время как ось определяет "направление движения'', тест узла определяет желаемые узлы, которые должны быть выбраны.
Ноль или более предикатов (predicates). Каждый предикат синтаксически записывается в квадратных скобках и используется для дальнейшего просеивания набора узлов, выбираемых шагом доступа.
Шаги в пути доступа вычисляются по очереди слева направо. Самый левый шаг вычисляется первым, обычно по отношению к контекстному узлу - корню дерева XML-документа. Каждый последующий шаг доступа выбирает набор узлов, который вычисляется по отношению к набору узлов, выбранному предыдущим шагом доступа. Набор узлов, выбранный самым правым шагом доступа - это результат всего пути доступа для данного XML-документа.
Пример пути доступа языка XPath приведен на рис. 2. Данный путь доступа состоит из 4 шагов доступа, во 2-м шаге доступа имеется один предикат, остальные шаги доступа предикатов не содержат. Если вернуться к рис. 1 и рассмотреть показанный на этом рисунке XML-документ "clients.xml", то нетрудно видеть, что путь доступа на рис. 2 для данного документа выбирает имя (name) человека (person), у которого имеется атрибут person-id со значением "per2". Специальный тест узла языка XPath text() используется в данном шаге доступа для адресации к текстовому узлу с целью получения имени.
Рис. 2: Пример пути доступа, который выбирает имя клиента, имеющего атрибут person-id со значением "per2".
Помимо рассмотренного синтаксиса для записи путей доступа (называемого также полным синтаксисом), Спецификацией XPath определяется также укороченный синтаксис (abbreviated syntax) для наиболее употребительных конструкций языка. При дальнейшем изложении мы будем пользоваться двумя такими правилами укороченного синтаксиса:
Ось child используется в шаге доступа по умолчанию, т.е. спецификатор
child:: может опускаться.
Разделитель в две идущие подряд косые черты ("//'') символизируют шаг доступа /descendant-or-self::node()/, выбирающий контекстный узел и всех его узлов-потомков.
В виде сокращенного синтаксиса путь доступа, рассмотренный на рис. 2, может быть переписан так: //person[attribute::person-id = 'per2']/
name/text()
Мы будем пользоваться сокращенным синтаксисом для компактной записи рассматриваемых далее примеров.
/A>Пример
На рис. 3 приведен пример расширенной ссылки языка XLink, которая соединяет несколько ресурсов о джазовом музыканте Луисе Армстронге. Из рисунка легко видеть, что Спецификация XLink не накладывает ограничений на имя элемента, являющегося расширенной ссылкой, а принадлежность этого элемента языку XLink и его ссылочный тип задаются глобальным атрибутом xlink:type.
Рис. 3: Расширенная ссылка XLink, соединяющая различные ресурсы о музыканте Луисе Армстронге.
Рис. 4: Представленные в виде информационных единиц и записанные в синтаксисе XML дуги языка XLink, которые были определены в расширенной ссылке на рис. 3.
Расширенная ссылка на рис. 3 соединяет 3 ресурса, а именно:
Описание биографии Луиса Армстронга. Это локальный ресурс языка XLink, т.е. всё содержимое ресурса целиком располагается внутри ссылочного элемента. Элемент языка XML специфицируется как локальный ресурс XLink с помощью наличия у данного элемента глобального атрибута
xlink:type со значением "resource".
Песни Луиса Армстронга, которые располагаются в некотором XML-документе "louis-songs.xml". Относительно рассматриваемой на рис. 3 расширенной ссылки этот ресурс является удаленным, поскольку к нему адресуются по его Унифицированному Идентификатору Ресурса. Удаленный ресурс описывается элементом языка XLink типа «локатор» [2], который специфицируется на языке XLink с помощью глобального атрибута xlink:type со значением
"locator".
Упоминания о Луисе Армстронге в прессе. Данный ресурс также является удаленным и представляет собой набор узлов - набор статей о музыканте, - выбираемых из документа "www.press.com/archive.xml" идентификатором фрагмента языка XPointer.
Каждый из описанных в расширенной ссылке ресурсов помечен собственной меткой, задаваемой значением атрибута xlink:label. Эти метки используются для описания дуг. В расширенной ссылке на рис. 3 определяются 2 дуги: от песен Луиса Армстронга к его биографии и от песен к упоминаниям о музыканте в прессе. Заметим, что последняя дуга соединяет два удаленных ресурса.
На рис. 4 для обеих дуг приведено их представление в виде информационных единиц, предложенное в рамках настоящей статьи и описанное выше в данном разделе. Буквой (а) на рис. 4 помечена дуга, ведущая от песен к биографии; буквой (б) - дуга, ведущая от песен к упоминаниям о музыканте в прессе. Для наглядности визуального восприятия предлагаемого представления дуг XLink в виде информационных единиц на рис. 4 используется синтаксис XML; альтернативно может использоваться любой другой синтаксис, который соответствует аналогичному набору информационных единиц Информационного Пространства XML. Заметим, что поведенческий атрибут способа активизации дуги, ведущей к биографии Луиса Армстронга, на рис. 4 (а) находит свое выражение в виде элемента с одноименным локальным именем.
Рассмотренный пример будет использоваться в ходе последующего изложения - при определении языковых средств для формулирования запросов к дугам XLink.
/A> Расширение XPath переходами по дугам языка XLink
Заметим, что термин ось (axis) в XPath очень близок термину переход (traverse) в XLink, поскольку и тот, и другой подразумевают перемещение с одного места в документе на другое. Данное наблюдение убеждает нас в том, что при построении на основе XPath языка запросов к совокупности связанных XML-документов операции перехода по дуге XLink в языке XPath должна соответствовать ось. По аналогии с англоязычным названием для перехода в XLink назовем эту ось "traverse''.
На содержательном уровне, если имеются узлы A и B, такие, что для некоторой дуги XLink узел A является исходным ресурсом, а узел B - целевым, то при применении оси traverse к узлу A как к контекстному узлу результатом будет узел B.
Если следовать общему стилю, принятому в Спецификации XPath при определении осей, то более строгое определение оси traverse будет выглядеть так:
Определение 1. Ось traverse содержит все узлы, являющиеся целевыми ресурсами для всех дуг XLink, для которых контекстный узел служит исходным ресурсом.
Из определения следует, что ось traverse возвращает непустой набор узлов только тогда, когда контекстный узел является исходным ресурсом хотя бы для одной дуги языка XLink.
Необходимо отметить, что осью traverse могут быть выбраны узлы, находящиеся в другом XML-документе, нежели контекстный узел; т.к. дуги языка XLink могут соединять ресурсы, находящиеся в разных XML-документах. Также в результате применения к контекстному узлу оси traverse может быть получен набор узлов из нескольких разных XML-документов, поскольку контекстный узел может быть исходным ресурсом для нескольких дуг XLink, и целевые ресурсы этих дуг могут располагаться в нескольких разных XML-документах.
Если целевой ресурс является удаленным ресурсом в терминах XLink и представляет собой целиком XML-документ (т.е. при адресации к данному ресурсу не используется идентификатор фрагмента на языке XPointer), то осью traverse будет выбран элемент документа. Если при адресации к удаленному целевому ресурсу Унифицированный Идентификатор Ресурса (URI) используется совместно с идентификатором фрагмента на языке XPointer и данный идентификатор фрагмента вычисляется в некоторый набор узлов, то осью traverse будет выбран весь этот набор узлов.
Выражение на языке XPath, расширенном предлагаемой осью traverse, позволяет прикладному приложению оперировать не с одним деревом XML-документа, а уже с деревьями нескольких документов, соединенных между собой с помощью ссылок языка XLink. При этом оси, определяемые Спецификацией XPath, замкнуты внутри отдельного дерева документа, а ось traverse позволяет осуществить переход между деревьями.
Необходимо отметить, что хотя совокупность XML-документов, соединенных ссылками XLink, представляет собой граф, вычисление любого выражения XPath, расширенного предлагаемой осью traverse, всегда будет конечным по времени. Данное свойство предлагаемого расширения языка XPath объясняется тем, что все оси, являющиеся транзитивным замыканием других осей, не могут зациклиться, поскольку замкнуты внутри конкретного дерева XML-документа, где циклы отсутствуют по определению дерева. Вычисление оси traverse также всегда конечно, поскольку для любого набора узлов существует лишь конечное число дуг XLink, исходными ресурсами которых являются узлы из данного набора.
Предложенная ось органичным образом вписывается в язык XPath, и при использовании данной оси в шаге доступа XPath полностью сохраняется семантика остальных составляющих шага доступа - теста узла и предикатов. Ввиду того, что по оси traverse можно перейти на узлы произвольного типа, тест узла помогает конкретизировать тип и, возможно, имя узлов, выбираемых шагом доступа.
Предикаты могут быть использованы для дальнейшего просеивания получаемого набора узлов в соответствии с некоторыми более сложными условиями. Как и для других осей, определенных спецификацией XPath, при применении предикатов к результату оси traverse контекстный размер равен количеству узлов в наборе, подлежащему фильтрации. Что касается контекстной позиции каждого узла, то для неупорядоченных наборов узлов - таких как атрибуты и объявления пространств имен - в Спецификации XPath сопоставление каждого узла с контекстной позицией объявляется зависящим от реализации [6]. Аналогичный подход может быть применен и для набора узлов, получаемый в результате оси traverse, т.к. по этой оси в общем случае осуществляется переход сразу по нескольким дугам XLink, которые не упорядочены между собой. Альтернативным подходом к сопоставлению узла с контекстной позицией может быть подход, принятый в языке XQuery: узлы в пределах одного XML-документа упорядочиваются в порядке обхода дерева документа, узлы из разных документов упорядочиваются произвольным, но единообразным образом для конкретной реализации [5].
Предлагаемая дополнительная ось traverse позволяет прикладному приложению осуществлять переходы по дугам языка XLink полностью прозрачным образом, без необходимости распознавать элементы XLink в XML-документе и разбирать их в соответствии с синтаксисом языка XLink с целью извлечения семантики дуг. Вне зависимости от того, где была определена дуга - в простой ссылке, или в расширенной ссылке, располагающейся в том же документе, или даже в отдельном документе, - переход по дуге осуществляется унифицированным образом.
Для иллюстрации предлагаемого расширения языка XPath осью traverse вернемся к рисунку 1, выражающему систему заказа товаров в виде 3 связанных XML-документов, и рассмотрим несколько примеров написания практических запросов к данной системе связанных документов.
Пример 1. Найдем имена всех клиентов, заказавших принтеры.
Для получения ответа на этот запрос требуется соединить данные изо всех 3 XML-документов на рис. 1, и соединение должно проводиться на основе ссылок XLink, связывающих части этих документов. Поскольку в рассматриваемой системе связанных XML-документов все ссылки языка XLink исходят из документа "purchase-orders.xml", описывающего сделанные заказы, то запрос будет адресоваться именно к этому документу, и наличие ссылок XLink позволит выбрать необходимую информацию из остальных документов с помощью оси traverse. Путь доступа, реализующий требуемый запрос, может быть записан следующим образом: //order[entry/item/traverse::printer]/
customer/traverse::person/name/text()
Шаг доступа, содержащий предикат и записанный в первой строке пути доступа, выбирает те выполненные заказы, в которых имеется хотя бы одно вхождение (entry) принтера среди заказанных товаров. Ось traverse внутри предиката осуществляет переход из каждого вхождения в заказе на каталог товаров; и тест узла printer позволяет указать, что из всех заказанных элементов каталога нас интересуют принтеры.
Во второй строке пути доступа, после того, как заказы были выбраны, осуществляется адресация к именам клиентов, сделавших соответствующие заказы. При адресации к именам клиентов снова используется ось traverse, и в этом случае она осуществляет переход уже на конкретного человека в документе "clients.xml", т.к. переход осуществляется по ссылке, ведущей от заказа к покупателю.
Результат вычисления запроса выбирает имя искомого клиента: John Smith
Пример 2. Найдем список товаров, заказанных важным клиентом (в описании которого имеется вложенный элемент <VIP/>).
С помощью языка XPath, расширенного осью traverse, данный запрос может быть реализован в виде следующего пути доступа: //order[customer/traverse::person/VIP]/
entry/item/traverse::*
В отличие от примера 1, здесь заказы фильтруются в соответствии с условием, накладываемым уже на клиента.
Результат запроса состоит из двух элементов каталога, и в соответствии с нотацией, принятой в XQuery для записи последовательности из нескольких узлов [5], мы записываем результат в круглых скобках, отделяя узлы друг от друга при помощи запятых: ( <printer>
<lot>001</lot>
<descr>Ink jet</descr>
<price>450</price>
</printer>,
<display>
<lot>003</lot>
<descr>Color, Digital</descr>
<warranty>2 years</warranty>
<price>500</price>
</display> )
/A> Разбор разметки языка XLink
При реализации предлагаемого языка запросов к совокупности XML-документов, связанных при помощи ссылок XLink, важным моментом технического характера является разбор элементов языка XLink в соответствии со спецификацией этого языка и инкапсуляция сложностей синтаксиса XLink от пользовательского приложения.
С целью создания единообразной среды для работы приложения как с SXML-документом, так и с дугой XLink, последняя также записывается в формате SXML. Для разбора XML-документа, содержащего ссылки языка XLink, и представления документа и дуг XLink на SXML, была реализована специализированная разновидность парсера SSAX[22]. SSAX - это парсер для разбора XML-документов, написанный на языке Scheme в чисто функциональном стиле и предоставляющий Простой Интерфейс Прикладного Программирования для XML (Simple API for XML - SAX). Интерфейс парсера SSAX основан на событиях, и в рамках данной статьи специализированные обработчики событий были реализованы для конструирования представления на SXML описанных в XML-документе дуг XLink, одновременно с конструированием представления на SXML самого разбираемого XML-документа. Реализованная архитектура специализированного парсера обеспечивает построение представления на SXML для документа и всех описанных в нем дуг XLink за один проход по документу.
Узел SXML-документа, являющийся исходным ресурсом для некоторой дуги XLink, соединяется со сконструированным представлением этой дуги при помощи концепции так называемых вспомогательных списков грамматики SXML. Вспомогательный список - это S-выражение, первым членом которого является служебный символ '@@. Вспомогательный список не может быть перепутан ни с одной другой информационной единицей SXML-документа, поскольку служебный символ '@@ не может быть корректным именем языка XML. Хранение предлагаемого представления дуг XLink внутри вспомогательного списка подчеркивает близость относительно Модели данных XPath между набором выходящих из данного узла дуг и набором атрибутов данного узла, поскольку атрибуты на SXML синтаксически записываются внутри списка со служебным именем '@.
Необходимо отметить, что соединяемые ссылками XLink удаленные ресурсы, являющиеся фрагментами XML-документа, на языке XPointer могут специфицироваться по уникальному идентификатору - значению атрибута типа ID. Например, на рассмотренном ранее рис. 1, выражающем систему заказа товаров, по атрибутам типа ID определяются ресурсы внутри документа
"clients.xml". Тип атрибута описывается не в самом XML-документе, но в его схеме; и поэтому разбор схемы XML- документа необходим для идентификации ресурсов, представляющих собой фрагменты внутри данного документа. Сделанная в рамках данной статьи реализация обеспечивает извлечение описаний атрибутов типа ID из схемы на языке Определения Типа Документа (Document Type Definition - DTD) [2].
Заметим, что документы на HTML также представляют собой слабоструктурированные данные, а семантика гиперссылок HTML, задаваемых при помощи элемента A, может рассматриваться как частный случай семантики дуг XLink. Из сделанного наблюдения следует, что применение предлагаемого в настоящей статье языка XPathLink может быть без изменений расширено на случай формулирования запросов к совокупности документов на HTML, связанных гиперссылками. Парсер HtmlPrag, позволяющий сконструировать представление в виде S-выражений для практических HTML-документов [23], в рамках данной статьи был дополнен обработкой гиперссылок HTML по аналогии с дугами XLink.
На высоком уровне, для получения в виде SXML набора связанных документов, прикладному приложению предоставляется функция xlink:documents (имя documents выбрано по аналогии с языками XSLT и XQuery, а префикс xlink подчеркивает связь данной функции с языком XLink). Функция принимает в качестве аргументов один или более Унифицированный Идентификатор Ресурса (URI) для интересующих приложение документов. По предоставленным Унифицированным Идентификаторам Ресурсов функция получает соответствующие документы, конструирует их представление на SXML и связывает все узлы SXML-документов, являющиеся исходными ресурсами для дуг языка XLink, с представлением этих дуг на SXML. Семантика функции xlink:documents объединяет в себе следующие действия:
получение документов по их Унифицированным Идентификаторам Ресурса, определение типа каждого документа: XML или HTML;
конструирование с помощью соответствующего парсера (специализированная реализация SSAX или HtmlPrag) представления документа на SXML и построение представления на SXML описанных в данном документе дуг XLink или гиперссылок HTML;
загрузка ссылочных баз языка XLink с целью получения тех дуг XLink, исходные и/или целевые ресурсы которых располагаются в интересующих приложение документах;
ассоциирование исходных ресурсов с соответствующими дугами XLink (учитывая ту специфику языка XLink, что дуги в общем случае описываются в другом месте относительно местоположения их исходных ресурсов).
Наличие единой функции
xlink:documents, обеспечивающей проведение всех описанных выше действий за один высокоуровневый вызов, способствует простоте использования сделанной реализации прикладным приложением.
/A> Реализация предложенных осей как расширения к SXPath
SXPath - это реализация XPath на языке функционального программирования Scheme, предоставляющая язык запросов к документам на SXML. Реализация SXPath трактует путь доступа как составной запрос к дереву документа или его ветви. Отдельный шаг доступа представляет собой комбинацию проекции, выборки или транзитивного замыкания [24]. Несколько шагов доступа комбинируются с помощью операций последовательного применения или объединения.
Библиотека SXPath состоит из набора низкоуровневых предикатов, фильтров, операций выборки и комбинаторов; и функций высокого уровня, реализованных в терминах низкоуровневых функций.
В рамках данной статьи предложенные 3 дополнительные оси, обеспечивающие поддержку в XPath языка XLink, были реализованы в качестве расширения к SXPath. Примечательно, что оси traverse и
traverse-arc, осуществляющие переход по дугам, прозрачным для приложения образом вызывают вычислитель языка XPointer, когда требуется разыменовать (resolve) идентификатор фрагмента на XPointer для целевого ресурса дуги. Упомянутые оси также могут прозрачным для приложения образом загружать по Унифицированным Идентификаторам Ресурса те документы, в которых располагаются целевые ресурсы перехода и которые ранее не были загружены с помощью функции
xlink:documents. Данное свойство сделанной реализации делает ее мощным инструментом для работы с ресурсами в масштабах Всемирной Сети.
Для иллюстрации сделанной реализации вернемся к некоторым рассмотренным ранее примерам и посмотрим их вычисление с помощью предложенного расширения SXPath поддержкой языка XLink.
Пример 6. Вычислим пример 1 с помощью SXPath, расширенного поддержкой языка XLink:
((sxpath/c
"//order[entry/item/traverse::printer]/
customer/traverse::person/name/text()")
(xlink:documents "purchase-orders.xml"))
Высокоуровневая функция sxpath/c получает на вход выражение XPath и конструирует реализацию этого выражения в виде комбинации низкоуровневых примитивов библиотеки SXPath. Сконструированная реализация выражения XPath имеет сигнатуру функции, которая затем применяется к набору узлов. В данном примере этот набор состоит из единственного узла - представленного на SXML документа
"purchase-orders.xml".
Результат вычисления данного кода на языке Scheme представляет собой список - набор узлов, состоящий из единственного текстового узла:
("John Smith")
Пример 7. Вычислим пример 2 с помощью SXPath, расширенного поддержкой языка XLink. sxpath/c "//order[customer/traverse::person/VIP]/ entry/item/traverse::*") (xlink:documents "purchase-orders.xml"))Результатом вычисления данного кода является следующий список, представляющий собой набор узлов на SXML:((printer (lot "001") (descr "Ink jet") (price "450")) (display (lot "003") (descr "Color, Digital") (warranty "2 years") (price "500")))
/A>Родственные работы по предметной области
В данном разделе рассматриваются работы, в которых делается попытка обеспечить язык запросов к совокупности XML-документов, связанных ссылками языка XLink, или предоставляются высокоуровневые возможности переходов по дугам XLink.
Адресация к дугам языка XLink
В предыдущем разделе было предложено простое и органичное расширение языка XPath осью traverse, которая предоставляет возможность осуществлять переходы по дугам XLink, и на основе практических примеров была проиллюстрирована гибкость предложенного расширения.
Необходимо заметить, что расширение языка XPath лишь осью traverse обеспечивает ограниченные функциональные возможности для адресации структурных частей XML-документов, связанных между собой ссылками XLink. Данное наблюдение мотивируется тем, что ось traverse осуществляет переход сразу по всем дугам XLink, для которых контекстный узел является исходным ресурсом,а таких дуг может быть несколько. Для шага доступа со спецификатором оси traverse присутствующие в шаге доступа тест узла и предикаты позволяют приложению наложить условия на интересующие целевые ресурсы, но не на дуги, по которым осуществляется переход в данном шаге доступа. В практических задачах обработки XML-документов, связанных ссылками XLink, может быть желательно выбирать только некоторые из дуг, по которым необходимо осуществить переход из контекстного узла, а также формулировать запросы непосредственно к дугам и их семантическим атрибутам.
В соответствии с обозначенными в разделе 1 пожеланиями к языку, который бы позволил приложению формулировать запросы к XML-документам, связанным при помощи ссылок XLink, необходимо инкапсулировать сложности синтаксиса языка XLink и предоставить приложению прозрачное представление для имеющихся в XML-документах ссылок. Для достижения поставленной цели в настоящей статье предлагается представление каждой дуги XLink в виде информационной единицы (information item) Информационного Пространства XML [14], которое может рассматриваться как представление (view) в терминах реляционных баз данных и позволяет формулировать запросы к дуге XLink единообразно с другими структурными частями XML-документа.
В данном разделе рассматривается предлагаемый способ представления дуги XLink как информационной единицы; затем в качестве дальнейшего расширения к языку XPath вводятся 2 дополнительные оси, позволяющие приложению формулировать запросы к дугам XLink как к самостоятельным сущностям.
Аннотация:
Язык ссылок XML (XLink)- это язык описания межресурсных связей при помощи атрибутов XML и специального пространства имен. Спецификация языка XLink Консорциума Всемирной Сети предоставляет лишь структуры данных для описания ссылок и минимальную модель их поведения.
В данной статье предлагается язык, который позволяет приложению прозрачным образом формулировать запросы к ссылкам XLink и осуществлять переходы по определяемым этими ссылками дугам. Предлагаемый язык был назван XPathLink, поскольку разрабатывался как органичное расширение языка адресации структурных частей XML-документа XPath. Язык XPathLink инкапсулирует сложности синтаксиса XLink от прикладного приложения и предоставляет более высокий уровень абстракции при обработке совокупности XML-документов, соединенных ссылками языка XLink, по сравнению с существующими подходами.
Рассматривается реализация предлагаемого языка XPathLink функциональными методами. Благодаря интеграции полученной реализации с языком программирования общего назначения Scheme на уровне узлов обрабатываемых XML-документов и функций Scheme достигается функциональность языка запросов к XML-документам, связанным ссылками XLink.
Язык XPath и переходы по дугам языка XLink
Предлагаемый в статье язык запросов к XML-документам, связанным между собой с помощью ссылок XLink, будет базироваться на языке адресации частей XML-документа XPath. В данном разделе сначала дается обзор языка XPath, затем рассматривается предлагаемое расширение функциональности XPath, обеспечивающее переходы по дугам языка XLink.
Язык запросов к совокупности XML-документов, соединенных при помощи ссылок языка XLink
Труды Института Системного Программирования РАН, 2004 г.
Nbsp;Исходный и целевой ресурсы дуги
Для хранения данных об исходном и целевом ресурсах дуги XLink предлагается использовать при ее представлении в виде информационной единицы дочерние информационные единицы типа «элемент». По аналогии с синтаксисом языка XLink для записи исходного и целевого ресурса дуги информационной единице, представляющей исходный ресурс, дадим локальное имя
from, а информационной единице, представляющей целевой ресурс - локальное имя to.
Заметим, что при представлении дуги XLink в виде информационной единицы не требуется использование пространств имен XML [18]. Как отмечается в [19], пространства имен в XML используются для того, чтобы позволить приложению однозначным образом распознать имя элемента или атрибута в XML-документе [20]. В частности, Спецификация XLink использует собственное глобальное пространство имен, чтобы элементы языка XLink могли быть распознаны среди прочих элементов XML-документа. В предлагаемом в настоящей статье представлении дуги XLink в виде информационных единиц ситуация иная: про все информационные единицы данного представления известно, что они служат для описания дуги, и поэтому использования в именах информационных единиц какого-либо пространства имен не требуется.
В синтаксисе языка XLink дуги и соединяемые ими ресурсы описываются отдельно друг от друга, а исходный и целевой ресурс дуги специфицируются опосредованным образом - при помощи меток. Для того, чтобы избавить приложение от необходимости самостоятельно сопоставлять метки языка XLink при определении соединяемых дугой ресурсов, предлагается при представлении дуги в виде информационной единицы использовать полные описания ее исходного и целевого ресурса, явным образом включенные внутрь описания дуги.
Дополнительно, для обеспечения прозрачности межресурсных связей, предлагается единообразное представление как для локальных, так и для удаленных ресурсов языка XLink. Данное единообразие достигается за счет наличия у информационной единицы, представляющей исходный (аналогично - целевой) ресурс дуги, любых из следующих 3-х дочерних информационных единиц типа «элемент»:
Информационная единица с именем uri, которая содержит последовательность символов, представляющих унифицированный идентификатор URI данного ресурса. Для удаленного ресурса XLink его унифицированный идентификатор явным образом задается в описании ресурса на языке XLink. Для локального ресурса XLink его идентификатором является унифицированный идентификатор XML-документа, в котором описан данный локальный ресурс.
Информационная единица с именем nodes, которая содержит сам ресурс - узел XML-документа или набор узлов - в качестве своих дочерних информационных единиц. Для локального ресурса XLink таким узлом является сам этот ресурс, т.к. только узел XML-документа может выступать в качестве локального ресурса.
Информационная единица с именем xpointer, которая содержит последовательность символов, представляющих идентификатор фрагмента на языке XPointer для данного ресурса. Идентификатор фрагмента может использоваться для определения удаленного ресурса XLink и задается явным образом в описании ресурса.
Необходимо отметить, что в зависимости от способа обработки XML-документов со ссылками языка XLink конкретным приложением, при описании дуги XLink в виде информационной единицы для данного приложения могут быть предпочтительными различные способы представления соединяемых дугой ресурсов. Так, если по семантике приложения предполагается осуществлять переходы по дуге многократно, то для обеспечения быстроты переходов разумно заранее вычислить удаленный целевой ресурс дуги и хранить полученный в результате вычисления набор узлов в описании дуги - как дочерние для информационной единицы nodes. Напротив, если предполагается долговременное хранение предлагаемого представления дуги XLink на диске, то с целью поддержания взаимосвязи между дугой и соединяемыми ею ресурсами, предпочтительно описывать эти ресурсы не "по значению'' - с использованием информационной единицы nodes, - а "по ссылке'' - с использованием совокупной семантики информационных единиц uri и xpointer.
Nbsp;Оси для адресации к дугам XLink
Теперь, когда определен способ представления каждой дуги XLink в виде информационной единицы Информационного Пространства XML, рассмотрим предлагаемое в данной статье дальнейшее расширение языка XPath, предоставляющее приложению возможность прозрачным образом формулировать запросы к дугам XLink.
Расширим функциональность языка XPath возможностью получить информацию обо всех дугах XLink, по которым можно осуществить переход из контекстного узла, т.е. таких, для которых контекстный узел является их исходным ресурсом. Следуя единообразию в дизайне предлагаемого расширения языка XPath поддержкой языка XLink, естественно оформить данную операцию получения всех дуг, исходным ресурсом которых является контекстный узел, в виде новой оси XPath. По аналогии с англоязычным термином для дуги, введенным Спецификацией XLink, данную ось назовем arc.
Определение 2. Ось arc содержит все узлы, являющиеся в терминах Информационного Пространства XML представлением в виде информационных единиц всех дуг XLink, для каждой из которых контекстный узел служит исходным ресурсом.
Из определения следует, что ось arc возвращает непустой набор узлов только для такого контекстного узла, который является исходным ресурсом хотя бы для одной дуги XLink. Каждый из узлов, возвращаемый осью arc, имеет тип «элемент», и его имя и внутренняя структура служат представлением для дуги XLink, которую этот элемент выражает.
При использовании в шаге доступа XPath спецификатора оси arc полностью сохраняется семантика остальных составляющих шага доступа - теста узла и предикатов. Например, тест узла позволяет выбрать дуги XLink по их именам - в соответствии с одним из 6 имен, предложенных для дуг в пункте 5.1.
Необходимо подчеркнуть, что каждый из узлов, возвращаемый предложенной осью arc, полностью соответствует Модели данных XPath [6], и поэтому к этим узлам далее могут применяться произвольные выражения XPath, с полным сохранением семантики этих выражений. В частности, предикаты могут использоваться для фильтрации дуг в соответствии со структурой представляющих их информационных единиц: например, выбрать дуги с конкретным значением некоторого семантического параметра XLink или наложить условие на тип целевого ресурса дуги.
Заметим, что в Модели Данных XPath [6], являющейся частью стандарта языка XPath Консорциума Всемирной Сети, узел типа «элемент» имеет ассоциированный с ним набор узлов типа «атрибут» и набор узлов типа «объявление пространства имен», и относительный порядок узлов в каждом из наборов считается зависимым от конкретной реализации. В полной аналогии с наборами атрибутов и объявлениями пространств имен можно говорить, что предлагаемое в данной статье расширение языка XPath поддержкой XLink дополняет Модель Данных XPath наличием ассоциированного с узлом любого типа набора выходящих из него дуг XLink. Каждая дуга реализуется в Модели Данных XPath узлом типа «элемент» и является представлением дуги в виде информационной единицы, как было описано в данном разделе.
Вернемся к расширенной ссылке на рис. 3 и представлению определяемой этой ссылкой дуг на рис. 4 и рассмотрим несколько кратких примеров использования предложенной оси arc. Необходимо отметить, что в соответствии с описаниями ресурсов и дуг, имеющимися в рассматриваемой расширенной ссылке, элемент документа (document element) [2] XML-документа
"louis-songs.xml" является исходным ресурсом сразу для 2 дуг языка XLink. (На рис. 3 документ "louis-songs.xml" опущен ввиду того, что его структура не важна для последующих рассматриваемых примеров).
Пример 3. Пусть контекстным узлом является элемент документа XML-документа
"louis-songs.xml". Выберем все сторонние дуги (third-party arcs), которые выходят из данного узла.
С использованием предлагаемой оси arc интересующие сторонние дуги могут быть получены с помощью выражения XPath - шага доступа:
arc::third-party
Результатом данного шага доступа является узел - приведенное на рис. 4 (б) представление дуги XLink в виде информационной единицы, записанное на данном рисунке в синтаксисе языка XML.
Заметим, что для получения данного результата приложению не требуется осуществлять разбор разметки языка XLink, поскольку эта работа полностью инкапсулирована предлагаемым в настоящей статье языком XPathLink.
Пример 4. Рассмотрим тот же контекстный узел, что и в примере 3. Выберем теперь все выходящие из данного контекстного узла дуги, имеющие поведенческий атрибут активизации со значением "onRequest".
Интересующие дуги могут быть получены с помощью следующего шага доступа: arc::*[actuate="onRequest"]
Результатом данного шага доступа является узел - представление дуги, приведенное на рис. 4 (а). Необходимо отметить, что вычисление используемого в шаге доступа предиката осуществляется с полным сохранением семантики языка XPath, т.к. предложенное представление дуг XLink, подлежащих фильтрации по условию предиката, унифицировано с другими узлами XML-документа.
Наличие оси arc позволяет приложению формулировать запросы к дугам XLink и накладывать условия на интересующие дуги с помощью предикатов XPath. Когда интересующие приложение дуги XLink выбраны, приложению может потребоваться осуществить по ним переход. Для обеспечения данной функциональности можно было бы использовать введенную в разделе 4 ось traverse, расширив ее и для узлов, представляющих дуги XLink в виде информационных единиц. Однако в данной статье предлагается не перегружать ось traverse излишне сложной функциональностью, поскольку негативным примером подобной перегруженности служит ось parent (родитель) в Стандарте языка XPath. Так, для контекстного узла типа атрибут ось parent выбирает содержащий его элемент (owner element) [14], а для контекстного узла любого другого типа - его родительский узел. Данная функциональная перегруженность оси parent приводит к тому, что транзитивное замыкание оси parent - ось ancestor-or-self - выбирает узлы нескольких разных типов, будучи примененная к контекстному узлу типа «атрибут».
Для сохранения простоты семантики предлагаемого языка XPathLink, являющегося расширением языка XPath поддержкой языка XLink, в настоящей статье используется отдельная дополнительная ось для перехода к целевому ресурсу дуги XLink из информационной единицы, представляющей дугу. Данная ось получила название
traverse-arc, т.е. "переход из дуги''.
Определение 3. Ось traverse- arc содержит все узлы, являющиеся целевыми ресурсами для контекстного узла, представляющего в виде информационной единицы дугу XLink. Для любого другого контекстного узла ось traverse-arc содержит пустой набор узлов.
Как отмечалось выше, семантика оси traverse-arc во многом напоминает семантику оси traverse, и области определения этих осей дополняют друг друга. Общность осей
traverse-arc и traverse позволяет нам сразу перейти к рассмотрению примера.
Пример 5. Вернемся к примеру 3 и дополним его переходом по дуге. Пусть контекстным узлом снова является элемент документа XML-документа
"louis-songs.xml". Осуществим переход по всем сторонним дугам, для которых контекстный узел является исходным ресурсом.
При наличии предлагаемых в статье дополнительных осей XPath искомая последовательность действий может быть оформлена в виде следующего пути доступа: arc::third-party/traverse-arc::*
Результатом вычисления данного пути доступа является набор узлов - ресурс, описанный расширенной ссылкой на рис. 3 и содержащий упоминания о Луисе Армстронге в прессе.
Предложенные в настоящей статье 3 дополнительные оси для языка XPath связаны следующим отношением: для произвольного теста узла NodeTest справедливо traverse::NodeTest º arc::*/traverse-arc::NodeTest,
где символ тождественного равенства обозначает совпадение наборов узлов, выбираемых путями доступа в левой и правой частях тождества, для любого контекстного узла. Справедливость данного утверждения следует из того очевидного наблюдения, что последовательное применение осей arc и traverse-arc реализует те же действия, что и ось traverse, если не требуется накладывать условие на интересующие дуги XLink, по которым следует осуществить переход.
Nbsp;Семантические параметры дуги
В соответствии со Спецификацией XLink описание дуги может сопровождаться необязательными семантическими и поведенческими атрибутами. Семантические атрибуты включают в себя машинно-понимаемую роль дуги (arcrole) в системе межресурсных связей и понимаемый человеком заголовок (title). Поведенческие атрибуты определяют момент активизации дуги (actuate) и способ демонстрации целевого ресурса (show).
Каждый из упомянутых атрибутов языка XLink в предлагаемом представлении дуги XLink выражается информационной единицей типа «элемент», которая носит локальное имя, совпадающее с локальным именем соответствующего атрибута. Каждая из информационных единиц содержит последовательность дочерних символов, которые выражают значение атрибута.
По уже обсуждавшимся в предыдущем пункте причинам, для информационных единиц в предлагаемом представлении дуги XLink не требуется использование какого-либо пространства имен. Использование информационных единиц типа «элемент» для выражения атрибутов языка XLink используется из соображений единообразного дизайна предлагаемого представления дуги XLink.
Ограничения предлагаемого языка запросов
Предложенный в данной статье язык XPathLink не предоставляет средств по работе с ресурсами XLink, которые не являются узлами или наборами узлов. Такими ресурсами могут быть только удаленные ресурсы (т.е. те, которые участвуют в ссылке XLink благодаря тому, что к ним адресуются с помощью унифицированного идентификатора URI), и к их числу относятся:
ресурсы, которые имеют формат, отличный от XML и XHTML, например, мультимедийные форматы; ресурсы, при адресации к которым используется идентификатор фрагмента на языке XPointer, вычисляющийся в интервал (range) или последовательность символов внутри текстового узла.
Введенные ограничения мотивированы требованием обеспечить замкнутость всех операций языка запросов относительно сущности "набор узлов''. Так, интервалы языка XPointer нарушают иерархическую структуру документа, поскольку разрывают границы разметки, и поэтому не могут быть представлены в виде набора узлов модели данных XPath.
Заметим, что идентичные ограничения приняты и в Спецификации Языка Преобразований XSL при обеспечении доступа к документам, отличным от обрабатываемого XML-документа [25]. Данная аналогия подтверждает, что введенные ограничения предложенного в настоящей статье языка XPathLink являются оправданными.
слева вверху) содержит каталог товаров;
Рисунок 1
Рис. 1: Набор связанных с помощью XLink XML-документов, выражающих систему заказа товаров. Документ
"catalogue.xml" ( слева вверху) содержит каталог товаров; документ
"clients.xml" (справа вверху) - данные о клиентах;
документ "purchase-orders.xml" (внизу) - сделанные клиентами заказы из каталога.
<?xml version='1.0'?> <catalogue> <printer> <lot>001</lot> <descr>Ink jet</descr> <price>450</price> </printer> <keyboard> <lot>002</lot> <price>20</price> </keyboard> <display> <lot>003</lot> <descr>Color, Digital</descr> <warranty>2 years</warranty> <price>500</price> </display> </catalogue> |
<?xml version='1.0'?> <!DOCTYPE clients [ <!- Атрибут person-id имеет тип ID -> <!ATTLIST person person-id ID #REQUIRED> <!- Остальные описания схемы опущены -> ]> <clients> <person person-id="per1"> <name>John Smith</name> <email>johnsmith@company.com</email> <VIP/> </person> <person person-id="per2"> <name>Paul Brown</name> <email>paul@brown.net</email> </person> </clients> |
<?xml version='1.0'?> <purchase-orders xmlns:xlink="http://www.w3.org/1999/xlink"> <order> <entry> <item xlink:type="simple" xlink:href="catalogue.xml#xpointer(//printer[lot=001])"/> <quantity>2</quantity> </entry> <entry> <item xlink:type="simple" xlink:href="catalogue.xml#xpointer(//display[lot=003])"/> <quantity>2</quantity> </entry> <customer xlink:type="simple" xlink:href="clients.xml#per1"/> </order> <order> <entry> <item xlink:type="simple" xlink:href="catalogue.xml#xpointer(//keyboard[lot=002])"/> <quantity>1</quantity> </entry> <customer xlink:type="simple" xlink:href="clients.xml#per2"/> </order> </purchase-orders> |
Пример пути доступа, который выбирает
Рис. 2: Пример пути доступа, который выбирает имя клиента, имеющего атрибут person-id со значением "per2".
/child::clients/child::person[attribute::person-id = "per2"]/child::name/child::text()
Расширенная ссылка XLink, соединяющая различные
Рис. 3. Расширенная ссылка XLink, соединяющая различные ресурсы о музыканте Луисе Армстронге.
<louis-armstrong xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="extended"> <biography xlink:type="resource" xlink:label="bio"> <name>Louis Daniel Armstrong</name> <born>August 4, 1901</born> ... <!-Описание биографии Луиса Армстронга -> </biography> <songs xlink:type="locator" xlink:label="songs" xlink:href="louis-songs.xml"/> <press xlink:type="locator" xlink:href="www.press.com/archive.xml#xpointer(paper[keyword='Armstrong'])" xlink:label="papers"/> <to-bio xlink:type="arc" xlink:from="songs" xlink:to="bio" xlink:actuate="onRequest"/> <arc xlink:type="arc" xlink:from="songs" xlink:to="papers"/> </louis-armstrong> |
в синтаксисе XML дуги языка
Рис. 4. Представленные в виде информационных единиц и записанные в синтаксисе XML дуги языка XLink, которые были определены в расширенной ссылке на рис. 3.
( <inbound> <from> <uri>louis-songs.xml</uri> </from> <to> <nodes> <biography xlink:type="resource" xlink:label="bio"> <name>Louis Daniel Armstrong</name> (а) <born>August 4, 1901</born> ...<!- Описание биографии Луиса Армстронга --> </biography> </nodes> </to> <actuate>onRequest</actuate> </inbound>, <third-party> <from> <uri>louis-songs.xml</uri> </from> <to> (б) <uri>www.press.com/archive.xml</uri> <xpointer>xpointer(paper[keyword='Armstrong'])</xpointer> </to> </third-party> ) |
и его представление
Рис. 5. XML-документ (левый столбец) и его представление в SXML.
<?xml version='1.0'?> <doc> <tag attr1="value1" attr2="value2"> <nested>Text node</nested> </tag> <empty/> </doc> |
(*TOP* (*PI* xml "version='1.0'") (doc (tag (@ (attr1 "value1") (attr2 "value2")) (nested "Text node") ) (empty) )) |
Вычисление счета для каждого заказа:
Рис. 6: Вычисление счета для каждого заказа: с помощью XQuery, расширенного поддержкой XLink, (вверху) и с помощью Scheme (внизу).
for $order in document("purchase-orders.xml")//orderreturn <bill> <total-price>{ fn:sum( for $entry in $order/entry return item/traverse::*/price * quantity ) }</total-price> {$order/customer/traverse::person/name} </bill> (map (lambda (order) `(bill (total-price ,(apply + (map (sxpath/c "item/traverse::*/price * quantity") ((sxpath/c "entry") order)))) ,@((sxpath/c "customer/traverse::person/name") order))) ((sxpath/c "//order") (xlink:documents "purchase-orders.xml"))) |
Реализация
В данном разделе рассматривается реализация предлагаемого языка XPathLink при помощи функциональных методов программирования. В основе подхода к обработке XML-данных функциональными методами лежит SXML- представление Информационного Пространства XML в виде S-выражений [21]. Функциональный язык программирования Scheme, использованный для реализации, естественным образом обрабатывает S-выражения и, таким образом, SXML. В данном разделе дается краткий обзор SXML, затем рассматриваются ключевые моменты сделанной в рамках настоящей статьи реализации предлагаемого языка XPathLink.
Список литературы
[1] S. DeRose, E. Maler and D. Orchard (editors). XML Linking Language (XLink) Version 1.0. W3C Recommendation 27 June 2001.
http://www.w3.org/TR/xlink/
[2] Когаловский М.Р. Глоссарий по технологиям платформы XML. Версия 4 (25-11-2003).
http://www.elbib.ru/index.phtml?page= elbib/rus/methodology/xmlbase/glossary_XML
[3] T. Bray and S. DeRose (editors). Extensible Markup Language (XML): Part 2. Linking. W3C Working Draft April-06-97.
http://www.w3.org/TR/WD-xml-link-970406.html
[4] S. J. DeRose (editor). XML XLink Requirements Version 1.0. W3C Note 24-Feb-1999.
http://www.w3.org/TR/NOTE-xlink-req
[5] S. Boag, D. Chamberlin, M. Fernandez, D. Florescu, J. Robie and J. Simeon (editors). XQuery 1.0: An XML Query Language. W3C Working Draft, 12 November 2003.
http://www.w3.org/TR/2003/WD-xquery-20031112/
[6] J. Clark и S. DeRose (редакторы). Язык XML Path (XPath) Версия 1.0. Рекомендация Консорциума Всемирной Сети от 16 Ноября 1999.
http://citforum.ru/internet/xpath/index.shtml
[7] Лизоркин Д.А. и Лисовский К.Ю. Языки XSLT и XLink и их реализация функциональными методами. Электронные Библиотеки, 2003, Том 6, Выпуск 5.
http://www.elbib.ru/index.phtml?page= elbib/rus/journal/2003/part5/LL
[8] T. Berners-Lee, R. Fielding, U.C. Irvine and L. Masinter. Request for Comments: 2396. Uniform Resource Identifiers (URI): Generic Syntax. Network Working Group, August 1998.
http://www.cse.ohio-state.edu/cgi-bin/rfc/rfc2396.html
[9] P. Grosso, E. Maler, J. Marsh and N. Walsh (editors). XPointer Framework. W3C Recommendation 25 March 2003.
http://www.w3.org/TR/2003/REC-xptr-framework-20030325/
[10] Лизоркин Д.А. и Лисовский К.Ю. Реализация XLink - языка ссылок XML - с помощью функциональных методов. Принята к публикации в журнал "Программирование'', 2005, номер 1.
http://www.maik.rssi.ru/cgi-bin/journal.pl?name=procom&page=main
[11] A. Malhotra, J. Melton and N. Walsh (editors). XQuery 1.0 and XPath 2.0 Functions and Operators. W3C Working Draft 23 July 2004.
http://www.w3.org/TR/2004/WD-xpath-functions-20040723/
[12] B. DuCharme. XLink: Who Cares? XML.com, O'Reilly Media.
http://www.xml.com/pub/a/2002/03/13/ xlink.html
[13] Лисовский К.Ю. Разработка XML- приложений на языке Scheme. Программирование, выпуск 28, номер 4, 2002.
http://www.maik.rssi.ru/journals/procom.htm
[14] J. Cowan and R. Tobin (editors). XML Information Set (Second Edition). W3C Recommendation 4 February 2004.
http://www.w3.org/TR/xml-infoset/
[15] Лизоркин Д.А. и Лисовский К.Ю. SXML: XML-документ как S-выражение. Электронные библиотеки, 2003, Том 6, Выпуск 2.
http://www.elbib.ru/index.phtml?page= elbib/rus/journal/2003/part2/LK
[16] Лизоркин Д.А. и Лисовский К.Ю. Язык XML Path (XPath) и его функциональная реализация SXPath. Электронные Библиотеки, 2003, Том 6, Выпуск 4.
http://www.elbib.ru/index.phtml?page= elbib/rus/journal/2003/part4/LL
[17] O. Kiselyov. SXML, revision 3.0, March 12, 2004.
http://okmij.org/ftp/Scheme/SXML.html
[18] T. Bray, D. Hollander and A. Layman (editors). Namespaces in XML. World Wide Web Consortium 14-January-1999.
http://www.w3.org/TR/REC-xml-names/
[19] J. Clark. XML Namespaces. February 4, 1999.
http://www.jclark.com/xml/xmlns.htm
[20] Лизоркин Д.А. и Лисовский К.Ю. Пространства имен в XML и SXML. Электронные библиотеки, 2003, Том 6, Выпуск 3.
http://www.elbib.ru/index.phtml?page= elbib/rus/journal/2003/part3/LL
[21] O. Kiselyov and K. Lisovsky. XML, XPath, XSLT Implementation as SXML, SXPath and SXSLT. International Lisp Conference ILC 2002, San Francisco. October, 2002.
http://www.okmij.org/ftp/papers/SXs.pdf
[22] O. Kiselyov. A better XML parser through functional programming. Practical Aspects of Declarative Languages: 4th International Symposium, PADL 2002. Springer-Verlag Heidelberg, ISSN: 0302-9743.
http://www.okmij.org/ftp/papers/XML-parsing.ps.gz
[23] Neil W. Van Dyke. HtmlPrag: Pragmatic Parsing of HTML to SHTML and SXML. July 2004.
http://www.neilvandyke.org/htmlprag/
[24] K. Lisovsky. STX: Scheme-enabled XSLT processor.
http://www.pair.com/lisovsky/transform/stx/
[25] J. Clark (редактор). Язык преобразований XSL (XSLT) Версия 1.0. Рекомендация Консорциума Всемирной Сети от 16 ноября 1999.
http://www.rol.ru/news/it/helpdesk/ xslt01.htm
Данная статья посвящена вопросу обработки
Данная статья посвящена вопросу обработки совокупности XML-документов как системы связанных ресурсов, описанной с помощью языка XLink. На основе анализа существующих работ в области обработки XML-документов, связанных ссылками XLink, была отмечена потребность в наличии языка высокого уровня, который бы инкапсулировал сложности синтаксиса XLink и обеспечивал приложение возможностями формулировать запросы к ссылкам XLink и осуществлять переходы по определяемым этими ссылками дугам.
Был проведен обзор языка адресации структурных частей XML-документа XPath, и было замечено непосредственное семантическое соответствие между переходом по дуге в терминах языка XLink и осью в XPath. Было предложено ввести в XPath дополнительную ось traverse, которая осуществляет переход из контекстного узла как из исходного ресурса дуги XLink на ее целевой ресурс. Были рассмотрены свойства предложенной дополнительной оси, и сценарии ее использования были проиллюстрированы практическими примерами.
Для обеспечения прикладного приложения возможностью прозрачным образом формулировать запросы к дугам XLink как к самостоятельным сущностям было разработано представление для дуг в виде информационной единицы Информационного Пространства XML. В язык XPath была добавлена ось arc, позволяющая приложению для данного контекстного узла получить все дуги XLink, для которых контекстный узел служит исходным ресурсом. Было отмечено единообразие предложенного слабоструктурированного представления дуг XLink и других узлов XML-документа, и рассмотрено место дуг XLink в Модели Данных языка XPath. Обсуждались преимущества наличия двух различных осей для перехода по дуге XLink из узла XML-документа и из слабоструктурированного представления дуги.
Рассматривались детали сделанной в рамках данной статьи реализации функциональными методами предложенного расширения XPath. Тесная интеграция сделанной реализации с языком программирования общего назначения Scheme обеспечивает прикладное приложение функциональностью языка запросов. Предложенный в статье язык запросов и его реализация функциональными методами являются мощным и гибким инструментом для обработки совокупности XML-документов, связанных ссылками XLink.