Текст
                    A.M. Елизаров
E.K. Липачев
M.A. Малахальцев
Веб-технологии
для математика:
основы
MathML
практическое руководство


Предисловие Мир информации сильно изменился — из привычных книг и газет он переместился в сферу электронных коммуникаций. В наши дни основная часть информации поступает, хранится и перерабатывается в электронном виде. Заметные изменения произошли и в сфере научного обмена: современного исследователя уже невозможно представить без компьютера, который из средства подготовки текстов превратился в инструмент добывания знаний. Электронная форма представления информации стала обычной и для математиков: мы уверены, что наш читатель — активный пользователь интернета, который, в частности, скачивает статьи, обменивается информацией по электронной почте, участвует в математических форумах. Возможно, он использует пакеты математических программ для символьных или приближенных вычислений, а они тоже все больше ориентированы на работу в сети. В общем, сеть компьютеров (как локальная, так и глобальная) на обозримую перспективу стала одним из основных инструментов научного исследования. Цель данной книги — дать представление о сетевых и веб-технологиях, которые основаны на языке разметки XML (расширяемом языке разметки) и применяются для работы с математической информацией. Уточним, что даже если наш читатель никогда не слышал об XML, он все равно сталкивается с ним всякий раз, когда заходит в интернет: многие веб-сайты уже используют XML-технологии, основная часть веб-страниц написана на HTML, а это — «частный случай» XML. Для кого написана эта книга. Для математика, желающего познакомиться с современными способами организации математической информации в сети (кстати, веб-технологии успешно работают и на персональном компьютере). Также книга может быть полезна специалистам по веб-программированию, которые хотят узнать, какие технологии актуальны для информационного обеспечения математического исследования. В целом книга ориентирована на исследователей, заинтересованных в распространении своих результатов в электронной форме, что особенно значимо в связи с переходом на онлайновое представление научных результатов. Важным шагом в этом направлении является международная инициатива Open Access to Research (http://www.eprints.org/openaccess/) (см., например, [1, 2]). Чего нет в этой книге. Нет объяснений, как открыть файл, набрать текст, подключить компьютер к сети, использовать сеть и подобных сведений — надеемся, что это читателю хорошо известно. С другой
стороны, эта книга не является руководством и для специалистов по вопросам веб-программирования — для этого надо изучать специализированные издания, а еще лучше — документацию по конкретным технологиям. Как организована эта книга. В главе 1 мы кратко описываем основные проблемы, связанные с автоматической обработкой научной информации, и даем вводный пример. В главе 2 рассказано о спецификации XML и ряде XML-технологий. С одной стороны, чтение этой главы не может заменить серьезного изучения каждой из описанных в ней технологий — для этого необходимы специализированные руководства (см., например, сайт www.w3.org). С другой стороны, мы постарались объяснить принципы работы этих технологий, дать достаточное количество поясняющих примеров и рецепты их применения. Читатель, знакомый с XML и его применениями, может эту главу пропустить. Если же он ставит своей целью только ознакомиться с MathML, то может прочитать начало главы 2, а к другим разделам обращаться по мере необходимости. Однако стоит отметить, что более глубокое изучение MathML требует знания всего материала главы 2. Также обратим внимание па то, что в этой главе приводится пример применения XML для организации каталога электронной библиотеки на персональном компьютере или в сети (локальной или глобальной). В главе 3 изложены начальные сведения о MathML и приведены примеры математических текстов, размеченных в MathML. Также рассказано о том, что сделать, чтобы MathML-документ отображался в различных браузерах (на самом деле, это потребуется только для браузера Internet Explorer, последние версии браузеров Firefox и Opera «понимают» MathML). Глава 4 посвящена синтаксису презентационного MathML, основной целью которого является отображение математических текстов, прежде всего, в браузерах. Приведено много примеров. Изучив эту главу, читатель, надеемся, сможет самостоятельно разобраться в любом MathML-документе и в случае необходимости отредактировать его. Вместе с тем, мы не претендуем на полноту изложения — полностью синтаксис презентационного MathML изложен в рекомендациях консорциума W3C [3]. Очень рекомендуем читателю изучить работу [4] и книги [5, 6], содержащие большое количество примеров MathML-документов. Также можно отметить сайт Алексея Бешенова (www.beshenov.ru) — активного участника внедрения технологий XML, переводчика документации консорциума W3C, — на этом сайте помещено значительное количество примеров применения MathML. В главе 5 рассказано о принципах содержательного MathML. Этот язык разметки ориентирован, прежде всего, на представление структуры математического выражения для обеспечения автоматизированной
обработки математических текстов с учетом их смысла. Эта задача сегодня еще не решена, однако поиск подходов к ее решению является перспективным направлением современной информатики, в разработке которого, как нам представляется, содержательный MathML сыграет важную роль. Читателю, у которого после прочтения данной главы возникнет желание подробнее познакомиться с содержательным MathML, рекомендуем работу [3] и вновь книги [5, 6]. В главе б мы рассказываем об инструментах работы с MathML. Эта глава, безусловно, полезна работающему математику, который решил использовать MathML. Мы описываем средства редактирования MathML-документов, конвертации из MTjjX в MathML, показываем, как организовать коллекцию электронных математических документов. В качестве обзора инструментария для работы с MathML материал этой главы может быть интересен и специалистам в области информационных технологий. Последние две главы, 7 и 8, носят в какой-то мере дополнительный характер. Дело в том, что языки разметки, подобные MathML, в настоящее время разработаны и для других областей знания. Например, в химии применяется язык химической разметки — CML (который, кстати, был создан раньше MathML). Поэтому математику, особенно если его интересуют приложения (а кого из математиков сейчас они не интересуют — жить-то надо!), будет интересна глава 7, где мы кратко рассказываем о специализированных языках разметки. Кстати, наличие спектра таких языков, имеющих один и тот же «проязык» XML, создает хорошую основу для формирования интегрированных баз знаний, содержащих информацию из разных предметных областей. Наконец, в главе 8 мы излагаем принципы семантического веба — сети ближайшего будущего, которая основана, в частности, на технологиях, описанных в настоящей книге. Семантический веб определенно изменит мир и вместе с ним мир науки, поэтому мы уверены, что информация о перспективах семантического веба будет интересна нашему читателю. Для нумерации рисунков в книге использованы две цифры, разделенных точкой, первая из которых соответствует номеру главы, а вторая — номеру рисунка в этой главе. Примеры пронумерованы так: m_n_k.l, где m — номер главы, п — номер раздела в ней, к — номер примера в этом разделе, а .1 — расширение имени файла, соответствующее его формату, например, .html. Что надо знать, чтобы читать эту книгу. Все зависит от ваших целей — можно ничего не знать о веб-технологиях, тогда что-то о них вы узнаете из нашей книги и получите общее представление об их применении для обработки математических текстов; можно знать все, и все-таки будет иметь смысл просмотреть эту книгу и найти кое-что новое (все же знать нельзя!). Разумным минимумом для понимания, по нашему мнению, является знание основ ИТ^Х и HTML, по крайней
мере, большая часть текста написана в расчете на читателя, знакомого с этими языками. Сайт книги. Примеры из данной книги, ее обновления и сопутствующие материалы размещены на сайте http://www.niimm.ksu.ru/ mathmlbook. Заключительные замечания. Работа над книгой выполнялась в течение последнего пятилетия в рамках проектов Российского фонда фундаментальных исследований 03-07-90252, 06-07-89132 (руководитель — В. Г. Веселаго), а с 2009 г. — в рамках проекта 09-07-12059-офи_м (руководитель — А.М.Елизаров). Когда мы писали эту книгу, то ориентировались на читателей с разным уровнем владения информационными технологиями. Мы постарались в какой-то мере структурировать текст так, чтобы его можно было прочитать, не углубляясь в детали, и, наоборот, получить дополнительную информацию по вопросу, вызвавшему интерес. Конечно, такой подход трудно осуществить в рамках классической книги (перефразируя Ницше, мы можем воскликнуть: «Книга умерла!») — для этого нужны информационные технологии следующего уровня. Однако обратите внимание на метки «Для продвинутого читателя», они помогут вам организовать чтение нашего руководства. Этот заголовок — всего лишь обозначение разделов, прочтение которых не обязательно для понимания следующего материала. Авторы выражают признательность рецензентам — члену-корреспонденту РАН А. Б. Жижченко и профессору В. Г. Веселаго, а также с благодарностью примут все замечания по тексту книги, сделанные читателями. Наши электронные адреса: elizarov@ksu.ru, lipachev@ksu.ru, Mikhail.Malakhaltsev@ksu.ru. Книга печатается при финансовой поддержке Российского фонда фундаментальных исследований (грант №09-07-07028).
1. ВВЕДЕНИЕ. ЗАЧЕМ НУЖЕН MATHML? ПЕРВЫЙ ПРИМЕР 1.1. Зачем нужен Math ML? Для того чтобы понять, зачем нужен MathML, можно сначала попытаться осознать, на каком этапе находятся сегодня информационные технологии и, в частности, наукоориентированные информационные технологии. Международная организация World-Wide Web Consortium ') (сокращенно W3C, см. сайт www.w3.org), разрабатывающая технологии глобальной сети, предложила новую концепцию развития интернета — Semantic Web (семантический веб), направленную на изменение основных принципов функционирования всемирной сети. Главная ее цель — обеспечение машинного управления информационным пространством. В своей основополагающей работе [7] («Дорожная карта семантического веба») Тим Бернерс-Ли утверждает: «Веб разрабатывался как информационное пространство, полезное не только для коммуникации человека с человеком, но и как пространство, в котором эффективное содействие могут оказывать также и машины; ... подход семантического веба базируется на разработке языков для выражения информации в форме, пригодной для машинной обработки». ') World Wide Web Consortium (W3C) — это международная организация, объединяющая в своих рядах около 450 членов и постоянный штат из более чем 60 сотрудников. W3C был организован в октябре 1994 г. по инициативе Тима Бернерса-Ли (Tim Berners-Lee), создателя «всемирной паутины», на базе Лаборатории вычислительной техники Массачусетского технологического института (Massachusetts Institute of Technology, Laboratory for Computer Science) при активном участии Европейской организации по ядерным исследованиям (Conseil Europeen pour la Recherche Nucleaire, CERN), Управления перспективных исследовательских программ (Defense Advanced Research Projects Agency, DARPA) и Европейской комиссии (European Commission). В апреле 1995 г. европейское представительство консорциума вошло в состав Национального института исследований в области компьютерной обработки данных и автоматики (Institut National de Recherche en Informatique et en Automatique, INRIA, France), а в 1996 г. появилось азиатское отделение — инициатором выступил японский центр Shonan Fujisawa Campus (Keio University of Japan). Наконец, Европейскому научно-исследовательскому консорциуму в области информатики и математики (European Research Consortium on Informatics and Mathematics, ERCIM) «были переданы функции» INRIA. Основным результатом деятельности W3C являются технические отчеты, программные средства с открытым кодом и различные услуги.
Как указано в программных документах консорциума W3C [8], семантический веб — это «... расширение традиционного веба в направлении существенно лучшего определения смысла информации, позволяющего компьютерам и людям эффективнее выполнять совместную работу. Мы хотим, чтобы данные в вебе были определены и связаны ссылками так, чтобы их можно было легче находить, интегрировать, автоматизировать и повторно использовать в различных приложениях, чтобы данные были разделяемыми и могли обрабатываться как автоматизированными средствами, так и людьми». Конечная амбициозная цель этого проекта состоит в создании такой среды, где программные агенты могут динамически обнаруживать и опрашивать ресурсы, а затем взаимодействовать с ними. Такие агенты должны уметь справляться с возникающими виртуальными проблемами интел- лектуализированной среды, обнаруживать новые факты и выполнять изощренные задания, получаемые от людей (см., например, [9]). На сайте www.w3.com консорциума W3C представлены новейшие разработки в области семантического веба. В рамках концепции семантического веба находятся разработка и использование языков разметки, специализированных под различные области знаний (подробно о семантическом вебе и специализированных языках разметки см. главы 7 и 8 настоящей книги). Для математического сообщества наибольший интерес представляет MathML (Mathematical Markup Language) — технология, предназначенная для представления либо разметки математических формул. Работу над этой технологией консорциум W3C начал в 1995 г., и уже в 1997 г. была подготовлена первая ее редакция. Для продвинутого читателя. Историю создания MathML можно узнать из официальных документов консорциума: http://www.w3.org/TR/MathML2/chapter 1 .html#id. 1.2.1. Она отражена и в книге [5]: «После того, как в 1994 г. был сформирован W3C, был поставлен вопрос о представлении математических текстов в сети. Вначале усилия W3C были сосредоточены на разработке дополнительных элементов для HTML, которые предполагалось включить в его будущие версии. В 1994 г. Дейв Рэджет (Dave Raggett) представил проект для HTML Math, который должен был быть включен в черновую версию HTML 3.0. В 1996 г. формальная поддержка новых математических элементов была добавлена в спецификацию HTML 3.2. Однако из-за того, что разработчики основных браузеров не проявили к этому интереса, этой попытке не удалось получить широкого признания. В 1997 г. была сформирована рабочая группа консорциума W3C по математике (W3C Math Working Group). К этому времени XML стал рассматриваться как общепризнанный стандарт расширения HTML. Поэтому рабочая группа решила разработать новый язык,
основанный на XML, который отличался бы от HTML. Он и был назван Mathematical Markup Language (MathML — язык математической разметки). Первая версия этого языка — MathML 1.0 — была обнародована как рекомендация W3C в апреле 1998 г.». Технологии семантического веба как система организации веб- информации предоставляют принципиально новые возможности для решения задач программной обработки документов (в частности, задачи поиска). Технология MathML изменила принципы организации и управления электронными публикациями по математике. Она уже используется в ряде электронных журналов (ссылки можно найти* например, на сайте www.eLibrary.ru). Также технология MathML все шире применяется на математических форумах (например, мехмата Московского университета — http://www.mmonline.ru). В настоящее время язык MathML фактически стал стандартом представления математической информации в электронной форме в силу следующих причин: • технология обработки данных на основе языка MathML реализует одну из основных тенденций современной информатики — разделение разметки и данных, поэтому она дает широкие возможности многоуровневого структурирования данных и расширенного поиска; • MathML — первое приложение XML, одобренное W3C и поддержанное большинством разработчиков программного обеспечения (в том числе IBM, HP, Microsoft, Sun) и профессиональным математическим сообществом (American Mathematical Society); • MathML с самого начала был разработан, чтобы использовать существующие веб-технологии, поэтому математический текст в формате MathML можно динамически обрабатывать, используя JavaScript и Java, стилизовать с помощью CSS и XSLT, вставлять в выпадающие меню HTML-документов; с помощью MathML можно создавать интерактивные сайты, которые способны отображать и обрабатывать математический контент, что очень важно для целей математического образования, научных исследований и любой области деятельности, где применяется математика; • создано программное обеспечение, использующее технологию MathML; в частности, созданы программы, позволяющие конвертировать в MathML документы, подготовленные с помощью стандартных технологий (таких, например, как МТ^Х, Mathematica, Maple, Word); MathML поддерживается основными браузерами: Internet Explorer (при установке соответствующего плагина), Mozilla, Firefox, Opera; • технология MathML поддерживается системами компьютерных вычислений Maple® и MathCAD, а компания Wolfram Research предложила собственную концепцию использования технологии
MathML, которая реализована в пакете Mathematica®, в частности, в нем предусмотрено сохранение документов в формате MathML. 1.2. Первый пример Откройте какой-нибудь текстовый редактор (программу, создающую текстовые файлы, например, Блокнот в MS Windows) и наберите в нем следующий текст. Файл 1 2 1.xhtml <?xml version="l.0"?> <html xmlns="http://www.w3 <body> org/1999/xhtml"> The quadratic equation is written as follows: <math xmlns="http://www <mi>a</mi> <msup> <mi>x</mi> <mn>2</mn> </msup> <mo>+</mo> <mi>b</mi> <mi>x</mi> <mo>+</mo> <mi>c</mi> <mo>=</mo> <mn>0</mn> </math> </body> </html> w3. org/1998/Math/MathML"> Теперь сохраните этот файл под именем 1_2 1 .xhtml (обратите внимание на расширение файла!) и откройте его в браузере Firefox или Opera. Например, в браузере Firefox получится изображение, представленное на рис. 1.1. Если в окне браузера вы видите такую же картинку — поздравляем: вы создали свой первый MathML-файл! Для продвинутого читателя. Если вы хорошо знаете HTML, то тот же текст сможете записать средствами этого языка. Попытайтесь сделать это и сравните результаты. Посмотрим снова на текст нашего MathML-файла и сравним его с тем, что видим на экране. Отличия очевидны — набранный нами текст отличается от текста в окне браузера, в нем значительно больше слов! Приглядевшись внимательно, мы замечаем, что слова, окруженные знаками <, > (например, <mi>, <mo>, <msup>), браузером не отображаются. Действительно, это так называемые теги — служебные слова, которые говорят браузеру, как отображать текст на экране и при печати. Таким образом, наш текст содержит разметку. Под
Щ/ Mozilla Firefox Файл Правка Вид Журнал Закладки Инструменты lea Ш Справка jj^P^^I О ч£ - i*J> ' %£ 4$ fg[ U fileWb/LEK/ ^ Начальная страница © Последние заголовки The quadratic equation is written as follows: ax *>Ji l+bx + 0:[Googl« c = 0 ч| Готово Рис. 1.1. Отображение файла 1 2 1 .xhtml в браузере Firefox разметкой текста принято понимать расстановку в тексте специальных знаков (кодов разметки), с помощью которых может осуществляться, например, форматирование текста перед его отображением или печатью. Набор соглашений о разметке называют языком разметки. У нас разметка осуществлена с помощью языка разметки, называемого XML (Extensible Markup Language) — браузер узнает это по первой строке нашего файла. В отличие от HTML, XML можно назвать языком «метаразметки» [5], так как множество его тегов не зафиксировано заранее. В нем разрешено определять произвольный набор тегов для решения специализированных задач (подробности см. в главе 2). На основе XML можно решать и многие задачи, возникающие в процессе научного исследования, например, правильно организовать электронную библиотеку на своем компьютере (в параграфе 2.9 мы покажем, как это сделать). Поэтому вначале мы достаточно подробно разберемся с XML и просим читателя проявить терпение, впрочем, постараемся скрасить столь долгое путешествие полезными примерами. Если же читатель хорошо знаком с XML или ему просто не терпится узнать, как же отображать математические формулы в браузере, рекомендуем ему перейти к главе 3 и возвращаться к начальным главам по мере надобности.
2. XML-ТЕХНОЛОГИИ 2.1. Языки разметки Как известно, разметкой называется расстановка в тексте специальных знаков — кодов разметки, а набор соглашений о разметке называют языком разметки. Посмотрите на следующий текст. Файл 2 1 1.html <html> <body background="#FFFFFF"> <Ы>Что такое разметка</Ы> <Р> Текст обычно форматируют, выделяя курсивом, подчеркиванием и т. д. расстановки в тексте специальных <л_>кодов </body> </html> разметки</л_>. определенные Это фра достигается значков, так гменты путем называемых Текст размечен с помощью HTML. Коды разметки — это слова, заключенные в угловые скобки, например, <html>, <hl>, <i> Этот текст размечен с помощью одного из самых старых, но одновременно и самых распространенных языков разметки — Hyper Text Markup Language или сокращенно HTML. Коды разметки — это слова, заключенные в угловые скобки: например, <html>, <hl>, <i>. Конечно, наш читатель знаком с HTML хотя бы «заочно» — подавляющее большинство веб-страниц написано именно на HTML, и, собственно, основное предназначение HTML — подготовка документов, отображаемых браузером (например, IE или Firefox). Коды разметки HTML — это как раз команды браузеру, как форматировать текст перед его отображением или печатью. Откройте файл 2 1 1 .html в любом браузере. Посмотрите (рис. 2.1) — в тексте нет никаких слов в угловых скобках, зато видно, что части текста отображены разными способами: «Что такое разметка» отображается жирным шрифтом большого размера, а «кодов разметки» — курсивом. Так получается потому, что наш текст размечен, а браузер воспринимает коды разметки как команды: к примеру, код разметки <i> — команда переключения на курсив, a </i> — команда отмены курсива. Этот же текст можно разметить, например, с помощью языка разметки TjfX.
Щ, Mozilla Rrefox |[5]|#|trf^j Файл Правка Вид Журнал Закладки Инструменты Справка % ч'-- * -У ~ @ ''■ l& LyJi!^.///E:/LEK^?*yLiI^3 0*iicci!i. _TS> ф* Начальная страница Ь4 Последние заголовки Что такое разметка Текст обычно форматируют, выдели определенные фрагменты к>рсивом, подчеркиванием и т. д. Это достигается путём расстановки в тексте специальных значков, так называемых кодов разметки. Готово Рис. 2.1. Отображение файла 2_l_l.html в браузере Firefox. Текст отображен разными способами: «Что такое разметка» отображается жирным шрифтом большого размера, а «кодов разметки» — курсивом Файл 2 1 2.tex \documentclass[12pt]{article} \usepackage[russian]{babel} \usepackage[utf8]{inputenc} \begin{document} \section{Что такое разметка} Текст обычно форматируют, выделяя определенные фрагменты курсивом, подчеркиванием и т.\,д. Это достигается путём расстановки в тексте специальных значков, так называемых \етрЬ{кодов разметки}. \end{document} Текст размечен с помощью TgX Коды разметки в данном случае являются командами компилятору Т^Х, создающему dvi-файл (dvi — device independent file format), который может просматриваться и распечатываться с помощью программы, называемой dvi-просмотрщиком (например, xdvi (пакет tetex) или yap (пакет МЛкТеХ)). Все текстовые редакторы, позволяющие изменять шрифт, выводить часть текста курсивом или жирным шрифтом (например, MS Word и Open Office), используют соответствующий язык разметки, но он, как правило, скрыт от пользователя. Языки разметки появились, как только компьютер стал использоваться не только для вычислений, но и как средство обработки символьной информации. Поначалу эти языки применялись именно для подготовки текстов к отображению на экране монитора или к печати, но, как мы увидим в дальнейшем, область применения языков разметки стала значительно шире. Для продвинутого читателя. Язык разметки (текста) представляет собой набор символов или последовательностей, вставляемых
««Yap - [2.2] ■ . Ъ$Щ . ^>■ -^J/^HIlS |E) File Vi^ Trote /Wndow^Jjd^j '._1,;.. _:._:.£_.._I':-:-. ..-ВИИ [ее | a it 14- i."l ■<■ -»"| ® e g ] н ай* IBo ®-l " " 1 Что такое разметка Текст обычно форматируют, выделяя определенные фрагменты курсивом, подчеркиванием и т. д. Это достигается путём расстановки в тексте специальных значков, так называемых кодов разметки. [ 2_2.tnb8 441J0,21420pt:Pageiastofl) | Рис. 2.2. Отображение просмотрщиком xdvi файла 2_1_2.dvi, полученного компиляцией файла 2_1_2.tex в текст с целью передачи информации о его выводе или строении. Документ, написанный с использованием языка разметки, содержит не только сам текст (как последовательность слов и знаков препинания), но и дополнительную информацию о различных его участках, например, указание на заголовки, выделения, списки и т.д. Различают стилистическую, структурную и семантическую разметки, каждая из которых выполняет свою функцию (см., например, [10]). Стилистическая разметка определяет внешний вид документа (например, «данную строку следует отображать жирным шрифтом»), структурная задает структуру документа (разделение на параграфы, абзацы и т.д.), а семантическая разметка содержит сведения о содержании данных (например, строка, выделенная разметкой, является адресом электронной почты). Generalized Markup Language — GML В 1960 г. компания IBM был разработан один из первых языков разметки — GML. Сотрудники IBM Чарльз Гольдфарб (Charles Goldfarb), Эд Мошер (Ed Mosher) и Рэй Лори (Ray Lorie) сформулировали три общих принципа, обеспечивающих возможность совместной работы с документами в разных операционных системах: • использование единых принципов форматирования во всех программах, выполняющих обработку документов, — наличие единого набора синтаксических конструкций и общей семантики заметно упрощает взаимодействие; • специализация языков форматирования — благодаря возможности построения специализированного языка на базе набора стандартных правил программист перестает зависеть от внешних реализаций и их представлений о потребностях конечного пользователя;
• четкое определение формата документа: правила, определяющие формат документа, задают количество и маркировку языковых конструкций, используемых в документе, — применение стандартного формата гарантирует, что пользователь будет точно знать структуру содержимого документа; обратите внимание: речь идет не о формате отображения документа, а о его структурном формате; набор правил, описывающих этот формат, называется «определением типа документа» (document type definition, DTD). Эти три правила были заложены в основу GML. Исследования и разработка GML продолжались около десяти лет, пока в результате соглашения, заключенного международной группой разработчиков, не появился стандарт SGML. Standard Generalized Markup Language — SGML SGML является международным стандартом обмена электронной информацией между различными аппаратными и программными компонентами и определяет формализованный набор правил для создания языков. В 1986 г. он был принят в качестве стандарта ISO («ISO 8879:1986 Information processing — Text and office systems — Standard Generalized Markup Language (SGML)». На базе SGML были созданы языки разметки HTML, XML и SGML Docbook. Отметим, что SGML дает множество вариантов синтаксической разметки для использования различными приложениями, однако сложность этого языка затруднила его широкое распространение. Hyper Text Markup Language — HTML Идея отображения гипертекстовых документов с помощью веб- браузера, предложенная Тимом Бернерсом-Ли (Tim Berners-Lee), не требовала многих возможностей, поддерживаемых полной реализацией SGML. В начале 1990-х гг. Тим Бернерс-Ли разработал язык разметки HTML, который предназначался для обмена научной и технической информацией, прежде всего, сотрудниками Европейского совета по ядерным исследованиям (CERN) в Женеве. Тем не менее, у HTML имеется существенный недостаток: он не позволяет разработчику создавать собственные типы документов. Результатом стала «война браузеров», в ходе которой разработчики браузеров начали создавать свои собственные версии языка HTML. Эти модификации существенно отклонялись от единого стандарта HTML и вызвали настоящий хаос среди разработчиков, которые хотели создавать веб-сайты, не зависящие от браузера. 2.2. Что такое XML Extensible Markup Language (XML) переводится как «расширяемый язык разметки» и является языком разметки так же, как HTML. Но HTML создан для демонстрации данных и «заботится», прежде всего, о том, как они выглядят, a XML предназначен для описания структу-
ры данных и того, что именно они собой представляют. Вот пример XML-файла: Файл 2 2 l.xml <?xml version="l.0" encoding="utf-8' <book> <title> Веб-технологии <authors> outhor id="l"> A.M. Елизаров </author> Outhor id="2"> E.K. Липачев </author> <author id="3"> M.A. Малахалыдев. </author> </authors> </book> для ?> MaTeMaTHKa</title> Простейшее XML-описание книги; в этом тексте содержатся не только слова, но с помощью тегов описан и смысл этих слов Даже без знакомства с основными положениями XML по приведенному коду можно определить, что в файле 2_2_1.xml содержится информация об авторах книги и ее названии. Легко заметить, что с помощью тегов <title> выделено название книги, а теги <author> указывают авторов. В чем смысл такой организации информации? Допустим, что человек читает следующий текст: A.M. Елизаров, Е.К. Липачев, М.А. Малахалыдев. «Веб-техиологии для математика» Человек поймет, где здесь авторы, название и что это информация о книге, а компьютер — нет! Он, скорее всего, догадается (именно догадается, поскольку в тексте прямо об этом не сказано), что речь идет о книге, А.М.Елизаров, Е.К. Липачев, М. А. Малахальцев — ее авторы, а «Веб-технологии для математика» — название. Дело в том, что естественный язык информационно избыточен, поэтому по части информации можно восстановить ее целиком. Однако для компьютера все это только наборы символов, и поэтому самостоятельно разобраться, где здесь название, авторы и что речь вообще идет о книге, он не сможет. Поэтому необходим язык, на котором можно было бы записывать «информацию об информации». Одним из таких языков и является XML. Для продвинутого читателя. В документах W3C [11] язык XML характеризуется следующим образом.
Расширяемый язык разметки — подмножество SGML. Язык должен давать возможность передавать, получать и обрабатывать в вебе общие документы SGML так же, как сейчас это можно делать с документами HTML. Язык XML спроектирован так, чтобы упростить реализацию и обеспечить взаимодействие SGML и HTML. XML характеризует класс объектов XML-document, а также частично описывает работу компьютерных программ, обрабатывающих объекты с данными, реализующими этот класс. XML — это прикладной уровень или усеченная форма SGML, Стандартного обобщенного языка разметки (ISO 8879). По своему построению XML-документ является полноценным SGML-документом. XML-документы состоят из единиц размещения, называемых сущностями, которые содержат разобранные или неразобранные данные. Разобранные данные состоят из набора символов, часть которых образует символьные данные, а часть — разметку. Разметка образует описание схемы размещения и логической структуры документа. Язык XML дает механизм создания ограничений для указанной схемы размещения и логической структуры. Для чтения XML-документа, доступа к его содержимому и структуре используется программный модуль, называемый XML-процессором. Кто придумал XML? Язык XML был разработан группой XML Working Group (первоначально называемой SGML Editorial Review Board), сформированной в 1996 г. под патронажем World Wide Web Consortium. Председательствовал в группе Джон Бозак (Jon Bosak) из Sun Microsystems, принимавший также активное участие в работе группы XML Special Interest Group (ранее известной как SGML Working Group), которая тоже была сформирована W3C. Задачи XML. При разработке языка XML ставились следующие задачи: • XML должен быть пригоден для непосредственного использования в интернете; • XML должен иметь широкий круг применения; • XML должен быть совместим с SGML; • обработчики XML-документов должны быть просты в написании; • в XML количество факультативных свойств должно быть сведено к абсолютному минимуму, в идеале их число вообще должно быть нулевым; • XML-документы должны быть удобны для чтения и достаточно понятны; • подготовка XML-документа должна осуществляться быстро;
• процедура построения XML-документа должна быть формальной и точной; » процедура создания XML-документов должна быть простой; • краткость при разметке XML-документа имеет минимальное значение. Нормативные документы. Последняя (на настоящий день) пятая редакция XML 1.0 доступна по адресу: http://www.w3.org/TR/2008/REC-xml-20081126/. XML 1.1. Спецификация XML 1.1 разработана для обеспечения совместимости XML с Unicode Standard, который в настоящее время еще не принял окончательной формы. Эта спецификация — возможно первый пример «совместимости вперед», в отличие от «обратной совместимости» (когда новая версия программы сохраняет все свойства предыдущей). Вторую редакцию спецификации XML 1.1 можно найти на сайте http://www.w3.org/TR/2006/REC-xmlll-2006O816/. Подробное объяснение, зачем была разработана спецификация XML 1.1 и в чем ее отличия от XML 1.0, см., например, в статье [12]. Unicode и XML Unicode — это единая кодировка для большинства символов, используемых человечеством, — букв различных языков, математических и технических символов и т. п. Разработкой Unicode занимается организация Unicode Consortium (www.unicode.org), в документах которой говорится следующее. «По своей природе компьютеры могут работать лишь с числами, и для того, чтобы они могли хранить в памяти буквы или другие символы, каждому такому символу должно быть поставлено в соответствие число. До того, как появился Unicode, в мире имели хождение сотни различных схем подобного кодирования символов. Но ни одна из них не была столь универсальной, чтобы описать все необходимые символы: например, только для кодирования букв, входящих в алфавиты языков Европейского Сообщества, необходимо было использовать несколько различных кодировок. По большому счету, даже для отдельного языка, скажем, английского, не существовало единой системы кодирования, включавшей в себя все обычно используемые буквы, знаки пунктуации и технические символы. Более того, все эти схемы кодирования часто даже не были совместимы друг с другом. К примеру, две разные кодировки могли использовать один и тот же код для представления двух разных символов или присваивать разные коды одной и той же букве. В этой ситуации для любого компьютера, особенно сервера, приходилось поддерживать несколько разных кодировок, которые могли понадобиться, но даже и тогда при передаче данных на
другую платформу или при их преобразовании в другую кодировку всегда оставался риск, что эти данные окажутся поврежденными. Система Unicode присваивает уникальный код любому символу независимо от платформы, программы, языка. Unicode был принят как стандарт такими лидерами компьютерной индустрии, как Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys. Эта схема кодирования используется современными технологиями и стандартами, в том числе, XML, Java, ECMAScript (JavaScript), LDAP, CORBA 3.0, WML. Именно Unicode является официальной схемой реализации ISO/IEC 10646. Наконец, эта кодировка поддерживается множеством операционных систем, всеми современными браузерами интернета и другими программами. Использование Unicode в многоуровневых приложениях или программных комплексах, построенных в рамках архитектуры клиент-сервер, а также при представлении данных в интернете, приводит к значительному снижению расходов на поддержку этих продуктов или сервисов по сравнению со случаем использования старых схем кодирования. Действительно, Unicode позволяет создавать единый программный продукт или сайт интернета для множества платформ, языков и стран без каких-либо переделок. А его использование при передаче данных между различными системами предохраняет эти данные от повреждения». Повсеместное распространение стандарта Unicode, равно как и доступность поддерживающих его средств, в настоящее время являются одними из наиболее важных направлений развития индустрии программного обеспечения. Спецификации XML. С XML тесно связан ряд других спецификаций, некоторые из которых обсуждаются в нашей книге. XML Namespaces 1.1 (http://www.w3.org/TR/xml-namesll/). Эта спецификация описывает идентификацию элементов и атрибутов, используемых в XML-документах, с помощью пространств имен, идентифицированных ссылками IRI. Extensible Stylesheet Language — XSL. Эта спецификация состоит из XSLT и XSL:FO. XSL Transformations (XSLT) — это язык для преобразования одних XML-документов в другие XML-документы. Преобразование, записанное на языке XSLT, является набором правил преобразования дерева исходного XML-документа в дерево результирующего XML-документа. XSL Formatting Objects (XSL:FO) — это язык таблицы стилей, управляющей выводом документа. Может быть использован для вывода документов в различных стилях (например, можно задать поля, нумерацию разделов, разбиение на страницы), а также в различных форматах (HTML, PDF, PostScript, просто текст и др.).
XML Linking Language (XLink) — это язык разметки, позволяющий вставлять в XML ссылки на любые информационные ресурсы. XML Pointer Language (XPointer) — расширяемая спецификация, определяющая способы адресации структурных элементов и фрагментов документов в формате XML. Создана потому, что язык XLink позволяет организовать только внешние ссылки на информационные ресурсы, т.е. в нем не предусмотрена возможность ссылки на определенное место другого документа. Язык XPointer создан для записи таких уточненных ссылок. Отметим, что он задает только правила записи меток и обращения к ним с помощью ссылок языка •XLink. XPath — язык, созданный для адресации узлов и ветвей дерева XML-документа; он включает инструменты для работы со строками, числами и логическими выражениями. XML Schema — язык описания структуры, набора элементов и их атрибутов для XML-документов. 2.3. Правила построения ХМ L- доку ментов XML-документ состоит из элементов. Элемент строится следующим образом: <имя_элемента> содержимое_элемента </имя_элемента> Здесь <имя_элемента> — открывающий тег, </имя_элемента> — закрывающий тег, а между открывающим и закрывающим тегами записывается содержимое элемента. Для продвинутого читателя. Тег, тэг {англ. tag — «ярлык, этикетка, бирка; метить») — метка как ключевое слово; в более узком применении — идентификатор для категоризации, описания и поиска данных, задания внутренней структуры. Например, в XML-документе 2_2_1.xml элемент <title> Веб-технологии для математика</Ъ1Ъ1е> имеет имя title и содержание Веб-технологии для математика. Он выделен открывающим тегом <title> и закрывающим тегом </title>. Элемент может иметь атрибуты, они задаются в открывающем теге этого элемента следующим образом: <имя_элемента имя_атрибута="значение атрибута">. В документе 2_2_1.xml три элемента с именем author имеют атрибуты с именем id и значениями 1, 2 и 3. (!) Внимание. В отличие от HTML, спецификация XML не накладывает ограничений на набор элементов, используемых в документе, — пользователь создает собственное множество тегов и задает структурные отношения между ними. Например, в коде 2_2_1.xml встречается элемент author, которого нет среди тегов HTML.
На примере 2_2_1.xml видно, что в XML-документ могут входить элементы с одним и тем же именем, а имена элементов произвольны. Элементы могут быть вложены один в другой, например, элементы author вложены в элемент authors. Может сложиться впечатление, что XML-документ — это просто текст, в котором некоторые фрагменты выделены с помощью тегов. Однако это не так — XML-документ подчинен строгим правилам, выполнение которых необходимо для того, чтобы его «поняли» специальные программы, называемые XML-процессорами. Эти программы предназначены для обработки информации, содержащейся в XML-документах. Все основные современные браузеры (Firefox, Internet Explorer, Opera) содержат XML-процессоры, т. е. поддерживают XML. Правила построения XML-документа выглядят так: 1) XML-документы следует начинать с объявления XML, в котором определяется версия XML, например, <?xml version="1.0"?> (это объявление является инструкцией XML-процессору, обрабатывающему документ); 2) любому открывающему тегу должен соответствовать закрывающий тег; 3) в XML учитывается регистр символов; 4) значения атрибутов, используемых в определении тегов, должны заключаться в кавычки; 5) в любом XML-документе должен содержаться один корневой элемент для всего документа; 6) элементы не должны перекрываться; 7) вся информация, размещенная между открывающим и закрывающим тегами, рассматривается как данные, при этом учитываются все символы форматирования (пробелы, конец строки, табуляция); 8) в XML имеются зарезервированные символы, которые используются как элементы синтаксиса; в тексте эти символы нужно заменять последовательностями других символов по следующим правилам: Зарезервированный символ < > & // / Замена sit; &gt; Samp; &quot; Sapos ; Если перечисленные правила выполнены, то говорят, что документ! правильно построен или правильно оформлен (well-formed). Соб-; ственно только в этом случае он и является XML-документом.
Пояснения к правилам 5 и 6. Правило 6 регулирует вложенность элементов, его можно объяснить с помощью скобок. Возьмем множество скобок разного типа (круглые, фигурные, квадратные ... — придумайте другие типы скобок) и заменим каждый открывающий тег на открывающую скобку какого-нибудь типа, а закрывающий тег — на закрывающую скобку того же типа. Тогда это правило требует, чтобы были правильно расставлены скобки, а правило 5 означает, что внешняя скобка должна быть одна. Правильно: <c><a>A</axb>B</bx/c> - ([А](в)). Неправильно (скобки перепутаны): <с><а>А<Ь>В</ах/ЬХ/с> - ( [А{В] ) ) . Неправильно (несколько внешних скобок): <а>А</аХЬ>В</Ь> - [А] (В). Это же правило можно объяснить иначе. Нарисуем граф, вер- . шины которого — элементы; если элемент А вложен в элемент в, то соединим их стрелкой, идущей от А к в. Тогда этот граф должен быть деревом, т. е. графом, в котором от одной вершины до другой можно добраться, переходя по стрелкам одним и только одним способом, причем есть только одна вершина (корневая), от которой можно добраться до любой другой. Граф XML-документа Правильно: Неправильно (две корневые вершины): <cXa></a><b></bx/c> <a><b></b></a><c><dx/dx/c> с ас Л I I a b b d (!) Внимание. Правило 5 обеспечивает очень важное свойство само- подобности (фрактальности) XML-документа. Именно, набор элементов, вложенных в данный элемент, вместе с ним вновь удовлетворяет этому же правилу. Поэтому, если взять набор элементов XML-документа, вложенных в некий элемент, то вновь получим XML-документ. Так, документ 2_2_1.xml содержит поддокумент <authors> <author id="l"> A.M. Елизаров </author> <author id="2"> E.K. Липачев </author> outhor id="3"> M. A. Малахалыдев </author> </authora>
Это свойство хорошо известно в теории графов — ветвь дерева сама является деревом. Читатель, знакомый с программированием, наверняка оценит это важное свойство структуры XML-документа. 2.4. Пример XML-документа Рассмотрим более сложный пример — XML-документ, описывающий научный журнал. Включим в описание название журнала и адрес, а также несколько статей с указанием их названий и авторов. В тексте файла дадим краткие комментарии. В XML-файле они оформляются так же, как в HTML, т.е. < ! — комментарий ... —> Файл 2 4 l.xml <?xml version="l.О" encoding="windows-1251"?> <!-- Эта инструкция указывает разметку и кодировку—> <!— Корневой элемент: --> <journal> <!— Простой элемент title: --> <title»KypHan Be6-TexHonornu</title> <!-- Составной элемент contacts:--> <contacts> <!— Простые элементы address и url входят в элемент contacts: —> <address>Ka3aHCKHU yHHBepcHTeT</address> <url>ljm.ksu.ru</url> </contacts> <!-- Составной элемент articles: —> <articles> <!— Составной элемент article, атрибут ID имеет значение 1 —> <article ID="1"> <!— Простой элемент title: —> <title>{\sf MathML} и TeX</title> <!— Простой элемент author: --> <author>M. A. Manaxanbu.eB</author> </article> <!-- Составной элемент article, атрибут ID имеет значение 2 —> <article ID="2"> <!— Простой элемент title: --> <title>MathML и RDF</title> <!-- Простой элемент author: —> <author>E.K. Липачев</аи^ог> </article> </articles> </journal> <!—Все теги закрыты, документ завершен—> Дополнительные комментарии. Первая строка приведенного кода является инструкцией приложению, обрабатывающему документ {processing instruction). Эта инструкция не является обязательной —
решение включать или не включать ее в XML-документ зависит от того, какое приложение будет обрабатывать документ. К примеру, браузер Firefox обрабатывает документы в зависимости от расширения в имени файла. Так, если рассматриваемый документ сохранен как файл 2_4_1.xml (т. е. с расширением .xml), то браузер Firefox обрабатывает его как XML-документ независимо от присутствия в нем инструкции. Если тот же самый документ сохранить как файл с расширением .html, то он будет обрабатываться как HTML-документ опять-таки независимо от наличия инструкции. Тем не менее, в пятой редакции XML 1.0 рекомендовано начинать XML-документ с инструкции: XML-документ следует начинать с XML-декларации, которая определяет используемую версию XML («XML documents SHOULD begin with an xml declaration which specifies the version of XML being used»). Типичный вид XML-декларации: <?xml version="l.0" encoding="windows-1251" standalone="yes"?> Если инструкцию решено включать, то надо выполнять следующие правила: 1) инструкция должна идти первой строкой файла, и до нее не должно быть символов; 2) атрибут version является обязательным и указывает на версию XML; на момент написания настоящей книги имеются рекомендации по версиям 1.0 и 1.1; получая документ, версию которого он не поддерживает, XML-процессор должен выдать соответствующие сообщения. Атрибут encoding определяет кодировку документа, и его желательно указывать. Если документ содержит символы в одной из кодировок кириллицы (к примеру, windows-1251, KOI8-R или UTF-8), то в отсутствие этого атрибута XML-процессор может выдать сообщение об ошибке и прекратить обработку, и даже если обработка будет продолжена, то почти наверняка кириллица будет обработана неправильно. Атрибут standalone принимает значение yes, если данный документ ссылается на набор DTD-правил (см. параграф 2.6) в самом файле или вообще не использует DTD-правил. Если же данный документ ссылается на набор DTD-правил из внешнего файла, то атрибут standalone принимает значение по. В последующих строках объявлены элементы. Элемент состоит из открывающего и закрывающего тегов, а также данных, расположенных между этими тегами. Пустой элемент, например, Ьг, может записываться в виде <Ьг />. Имена не могут содержать пробелов, кроме того, имеет значение регистр символов. Одни элементы могут быть вложены в другие, как, например, элемент author из приведенного примера вложен в элемент article, который в свою очередь вложен в элемент articles. Один из элементов документа должен содержать все осталь-
ные, его называют корневым элементом или элементом документа. В нашем примере таким элементом является journal. Таким образом, элементы документа должны образовывать древовидную структуру. У элементов могут быть атрибуты, которые содержат дополнительную информацию об элементе. В приведенном примере элемент article содержит атрибут ID, с помощью которого каждой статье присваивается числовой идентификатор. Итак, сохраним рассматриваемый файл с расширением .xml и откроем его для просмотра в каком-либо браузере, например, Internet Explorer (далее IE). В результате получим представление XML-документа в виде дерева (рис. 2.3). Это представление не должно разочаровывать: задачи у XML шире, чем простое отображение документа. Для отображения XML-документов в привычном виде используется, например, XSLT-технология (см. раздел 2.7). jg D:\2_4_Lxml - Windows Internet Explorer if vj§6fe. '•H-^HffW D:\2_41-xml Xlfe)tii'e Scorch i2 Избранное I <jS Ш ' ILi " rS D:\2.4_l-xml i ! S ' ЁЗ L3 в ' Страница ■> <?xrnl version="1.0" encoding="windows-12Sl° ?> <journal> <!-- T.fcczz-:- э.-е::е:-:т t^cle --> < ti tie >Жу риал веб-технологий</title> - <contacts> <address>Ka3aHCKHJi университет </address> <uri>ljm.ksu.ru</uri> <ycontacts> - <articles> - <article ID="1"> <title>MathML и TeX</title> <author>M. А. Малахальцев</аи№ог> </article> - orticle ID="2"> <title>MathML и RDF</title> <author>E.K. 7lHna4eB</author> </article> </articles> </journal> |ф Компьютер {Защищенный режим: выкл. 4 ' *tl00% d* Рис. 2.3. Представление XML-документа в виде дерева в браузере IE 2.5. Пространство имен Множество элементов в XML, как уже было отмечено, не зафиксировано заранее, поэтому при создании XML-документа мы можем выбирать имена элементов достаточно произвольно. Это важное свойство
XML, обеспечивающее его гибкость, может, однако, создавать проблемы: в информационной системе, включающей набор XML-документов, некоторые элементы, разные по своему назначению, могут получить одинаковые имена. Поясним эту ситуацию простым примером. Файл 2 5 l.xml <?xml version="l.0" encoding="windows- <!-- Конфликт имен title —> <journal> <title>Lobachevskii Journal</title> <url>ljm.ksu.ru</url> <articles> <article ID="1"> <title>MathML and TeX</title> </article> <article ID="2"> <title>MathML and RDF</title> </article> </articles> </journal> -1251"?> В этом примере имя title используется и для элемента, содержащего название журнала, и для элемента с названием статьи. Заметим, что даже при наличии конфликта имен в документе последний может без ошибок отображаться в браузере, но более сложная обработка документа может оказаться невозможной. Для решения этой проблемы применяется технология «пространства имен». Пространство имен (namespace) — это некоторое множество связанных между собой имен или терминов. Имена в одном пространстве имен не могут иметь более одного значения. Пространство имен называют также контекстом, так как значение термина может изменяться в зависимости от того, в какое пространство имен он входит. Простым примером является имя человека. В пространстве имен «Семья» его достаточно, чтобы обозначить конкретного человека. В пространстве имен «Граждане Российской Федерации» этого не достаточно — нужно добавить дополнительную информацию: фамилию, адрес и т. п. Пространство имен в программировании — область определения переменных, типов, констант и т.п., оно используется для исключения конфликтов с другими именами вне данного блока. Технология «пространство имен» широко используется в современном программировании, многие языки программирования, например, C++, С# и Java, поддерживают свои модели пространства имен. В рамках XML технология «пространство имен» реализована в виде спецификации XML Namespaces (пространство имен XML) [13], предназначенной для разрешения проблем, связанных с конфликтами имен. Эта спецификация определяет, что пространство имен объявляется с помощью атрибута xmlns. Ему назначается идентификатор, который
используется как префикс в открывающих тегах элементов — он указывается после атрибута xmlns и отделяется двоеточием, а затем после знака равенства записывается адрес, однозначно идентифицирующий пространство имен. В следующем примере ххх как раз является таким префиксом: <journal xmlns:xxx="http://www.ken.ru/one" <xxx:title>Lobachevskii JournaK/xxx:title> Для обозначения пространства имен в XML Namespaces используют URI (единообразный идентификатор ресурса). Для продвинутого читателя. URI (Uniform Resource Identifier) — единообразный идентификатор ресурса. Это строка, позволяющая идентифицировать какой-либо ресурс: документ, изображение, файл, службу, ящик электронной почты и т.д. URI предоставляет простой и расширяемый способ идентификации ресурсов. Расширяемость URI означает, что уже существует несколько схем идентификации внутри URI, и еще больше будет создано в будущем. Самые известные примеры URI — это URL и URN. URL — это URI, который, помимо идентификации ресурса, предоставляет еще и информацию о местонахождении этого ресурса. URN — это URI, который идентифицирует ресурс в определенном пространстве имен (и, соответственно, в определенном контексте). Например, URN urn:ISBN 0-395-36341-1 - это URI, который указывает на ресурс (книгу) 0-395-36341-1 в пространстве имен ISBN, но, в отличие от URL, URN не указывает на местонахождение этого ресурса. В базовом виде URI представляется так: <схема>:<идентификатор-в-зависиыости-от-схемы>. В этой записи схема — это схема обращения к ресурсу, например, http, ftp, mailto, urn; идентификатор-в-зависимости-от-схемы — непосредственный идентификатор ресурса, вид которого зависит от выбранной схемы обращения к ресурсу. Примеры URI: http://ru.wikipedia.org/wiki/URI, ftp://ftp.is.co.za/rfc/rfcl808.txt, file://С:\UserName.HostName\Projects\Wikipedia_Articles\URI.xml, ldap://[2001:db8::7]/c=GB?objectClass?one, mailto:JohnDoe@example.com, sip:911@pbx.mycompany.com, news:comp.infosystems.www.servers.unix, data:text/plain;charset=iso-8859-7,%be%fg%be, tel:+l-816-555-1212, telnet://192.0.2.16:80/, urn:oasis:names:specification:docbook:dtd:xml:4.1.2.
Приведем пример разрешения конфликта имен в 2_5_1.xml с помо щью описанного механизма. Файл 2 5 2.xml <?xml version="1.0"?> <!— определение двух пространств имен, заданных идентификаторами —> <!— "http://www.kcn.ru/one" и "http://www.kcn.ru/two"—> <journal xmlns:x="http://www.ken.ru/one" xmlns:y="http://www.kcn.ru/two"> <x:title>Lobachevskii Journal</x:title> <url>ljm.ksu.ru</url> <articles> <article ID="1"> <y:title>MathML and TeX</y:title> </article> <article ID="2"> <y:title>MathML and RDF</y:title> </article> </articles> </journal> Приведем еще один пример, в котором образовано два простран ства имен с префиксами h и j. Префиксы используются в названия: элементов, указывая, к какому пространству имен относится даиньи элемент. Файл 2_5_3.xml. Пространства имен html и journal <7xml version="l.0" encoding="windows-1251"?> <!-- Пространства имен html и journal —> <html xmlns:h="http://www.kcn.ru/three" xmlns:j="http://www.ken.ru/four"> <h:head> <j:jrntitle>Lobachevskii Journal</j:jrntitle> </h:head> <!-- следующий элемент принадлежит пространству имен h —> <h:body> <!-- элемент jrntitle принадлежит пространству имен journal —> <j:jrntitle>Lobachevskii Journal</j:jrntitle> <j:url>ljm.ksu.ru</j:url> <j:articles> <j:article ID="1"> <j:title>MathML and TeX</j:title> </j:article> <j:article ID="2"> <j:title>MathML and RDF</j:title> </j:article> </j:articles> </h:body> </html>
Наконец, отметим, что существует два способа указать пространство имен, которому принадлежит данный элемент. Один был нами уже продемонстрирован — это указание перед именем элемента префикса, характеризующего пространство имен, например, <j:article>. Другой способ состоит в определении пространства имен по умолчанию с помощью атрибута xmlns. Например, в представленном ниже файле 2_5_4.xml все элементы принадлежат пространству имен journal. Файл 2_5_4.xml. Пространства имен по умолчанию <?xml version="l.0" encoding="windows- <!-- Пространство имен ; ournal <journal xmlns="http://www.ken <j rntitle>Lobachevskii <url>ljm.ksu.ru</url> <articles> <article ID="1"> <title>MathML and </article> <article ID="2"> <title>MathML and </article> </articles> </journal> Journa TeX</t RDF</t —> -1251"?> .ru/three"> L</jrntitle> itle> Ltle> Отметим, что префиксы xml зарезервированы за самим языком XML 2.6. DTD и XML-схемы «Машинная обработка» информации в рамках конкретной информационной среды невозможна без системы проверки соответствия поступающих документов назначению и формату данных (например, «числовые данные», а не «текст»). Процесс проверки носит название «валидация». В XML для этой цели используются технологии DTD и XML-схемы. Напомним, что XML-документ, удовлетворяющий правилам построения таких документов (см. п. 2.3), называется правильно построенным (well-formed). Указанные правила накладывают минимальные ограничения на структуру документа и используемые в нем символы, но никак не определяют набор элементов документа и их содержимого. Однако для эффективного использования XML необходим механизм наложения ограничений на набор элементов и их содержимое. Предположим, что мы создаем информационную систему для описания журнала. XML-документ, характеризующий, например, статью журнала, должен включать элемент, содержащий название статьи, а содержимое элемента, описывающего номер первой страницы публикации, должно быть числом. Если XML-документ не удовлетворяет данным условиям, то он должен быть отвергнут системой, но с помо-
щью проверки правильности структуры документа она сделать этого не сможет. Следовательно, для выделения специализированных типов XML-документов необходимо некоторое дополнительное описание правил или стандартов, которым должны удовлетворять документы данного типа. Такой контроль содержимого документа может быть осуществлен с помощью DTD-объявлений, а также XML-схем. 2.6.1. Действительные XML-документы и DTD. Язык DTD (Document Type Definition — определение типа документа) разработан как средство описания допустимых строительных блоков XML-документа. С его помощью можно задать структуру документа и список допустимых элементов. Правила на языке DTD (DTD-правила) могут быть объявлены внутри XML-документа или содержаться во внешнем файле, на который имеется ссылка в XML-документе. Набор DTD-правил состоит из правил для элементов и атрибутов, допустимых в XML-документе, а также регулирует порядок и число вложений элементов, т. е. задает грамматику для определенного типа документов. DTD-правила предназначены для XML-процессора (например, встроенного в браузер), анализирующего содержание документа перед его обработкой. Если в документе есть ссылка на набор DTD-правил и он им удовлетворяет, то этот документ называется действительным {valid) или корректным, используется также термин допустимый документ. Рассмотрим простой пример набора DTD-правил для XML-документов, описывающих журнал (файл 2_4_1.xml). Ссылка на внешний файл DTD-правил в XML-документе оформляется так: <!DOCTYPE имя_корня SYSTEM "имя_файла.сЛс1"> Имя, указанное за декларацией doctype, должно совпадать с именем корневого элемента. Файл 2_6_1.xml <7xml version="1.0" encoding="windows-1251"?> <!— DTD for journal XML —> <!— ссылка на файл DTD-правил --> <!DOCTYPE journal SYSTEM "2_6_2.dtd"> <journal> <jrntitle>Lobachevskii Journal</jrntitle> <contacts> <address>Kazan State University</address> <url>ljm.ksu.ru</url> </contacts> <articles> <article ID-"1"> <title>MathML and TeX</title>
<author>M. Malakhaltsev</author> </article> <article ID="2"> <title>MathML and RDF</title> <author>E. Lipachev</author> </article> </articles> </journal> Этот набор DTD-правил требует, чтобы: 1) XML-документ содержал корневой элемент с именем journal, в который были бы вложены элементы jrntitle, contacts, articles, причем именно в указанном порядке; 2) элемент articles либо был пустым, либо содержал несколько элементов article; 3) каждый из элементов article содержал элемент title и хотя бы один элемент author; при этом article должен иметь атрибут, значение которого равно номеру статьи; 3) элемент contacts содержал элементы address и url; 4) содержимое всех элементов было текстовыми строками. Набор DTD-правил, обеспечивающий выполнение условий 1) - 4), представлен в файле 2_6_2.dtd, на который есть ссылка в файле 2_6_1.xml. Файл 2 6 2.dtd < < < < < < < < < < < -- DTD for journal XML —> ELEMENT ELEMENT ELEMENT ELEMENT ELEMENT ELEMENT ELEMENT ATTLIST ELEMENT ELEMENT journal (jrntitle, contacts, articles)> jrntitle (#PCDATA)> contacts (address,url)> address (#PCDATA)> url (#PCDATA)> articles (article)*> article (title, author+)> article ID CDATA #REQUIRED> title (#PCDATA)> author (#PCDATA)> Поясним на основе этого набора DTD-правил наиболее существенные принципы построения DTD. Для описания элементов используется правило <!ELEMENT иыя_элемента содержание> Для описания содержания используется следующая система обозначений. Круглые скобки в содержании означают, что элемент составной. Так, в приведенном примере элементы journal, contacts, articles и article — составные. Запятая в скобках используется
в качестве разделителя элементов. Вместо запятой можно использовать символ «|» (вертикальная черта), который разделяет варианты содержимого, если их у элемента несколько. Например, запись <!ELEMENT phone (#PCDATA|EMPTY)> определяет, что элемент phone может содержать символьные данные (ключевое слово #pcdata) или оставаться пустым (ключевое слово EMPTY). Скобки задают также порядок появления элементов в документе. Например, запись <!ELEMENT contacts (address,url)> указывает, что элемент contacts содержит элемент address, и этот элемент должен быть первым, а также элемент url. Кроме того, можно задать количество повторений элемента, поставив один из знаков «+» (плюс), «*» (звездочка) или «?» (знак вопроса). Количество вложенных элементов можно задать несколькими способами. Список операторов элементов приведен в следующей таблице. Операторы элементов Признак ? * + 1 / Значение Нуль или ровно один экземпляр Нуль или несколько экземпляров Один или несколько экземпляров Ровно один экземпляр Один из элементов Перечисление элементов Эти знаки можно записывать не только после элементов, но и после скобок — в этом случае действие знака распространяется на множество элементов, заключенных в скобки. Знак «+» означает, что элемент или множество элементов встречаются в документе один или более раз. Знак «*» указывает, что в документе может быть любое число вхождений данного элемента, в частности, элемент может отсутствовать. Знак «?» используется в тех случаях, когда элемент или множество элементов встречаются не более одного раза. Например, запись <!ELEMENT article (title, author+)> указывает, что элемент article содержит элемент title, и он должен быть первым, а также один или более элементов author. Если элемент содержит символьные данные, то при его описании используется ключевое слово #pcdata. Ключевое слово empty в содер-
жании документа указывает, что это пустой элемент, например, элементы <br> и <hr> в HTML. Ключевое слово ANY означает, что элемент может содержать как символьные данные, так и другие элементы. Если у элемента есть атрибуты, как, например, атрибут ID у элемента article, то необходимо использовать инструкцию <!ATTLIST имяэлемента имяатрибута тип значение по умолчании» В этом объявлении необходимо перечислить все атрибуты, которые могут использоваться с данным элементом. Типы атрибутов можно разбить на три группы: строковые, маркированные и перечислимые атрибуты. Строковые атрибуты характеризуются ключевым словом cdata, в документе такие атрибуты могут содержать любые символьные данные. Группа маркированных атрибутов включают предопределенные атрибуты ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN И NMTOKENS. Они предназначены для конкретного использования, например, атрибут ID задает уникальный идентификатор элемента в документе. В нашем примере с помощью ID каждой статье присваивался числовой идентификатор. Подробности о назначении этих атрибутов можно найти в [14, 15]. Если атрибут содержит список значений, то он называется перечислимым, например, <!ELEMENT volume (#PCDATA)> <!ATTLIST volume month (1|2|3|4|5|6|7|8|9|10|11|12) #REQUIRED> Параметр #required определяет, что данный атрибут является обязательным. Есть еще два параметра: tiMPLiED, указывающий, что атрибут является необязательным, и #FIXED, требующий, чтобы только указанное в атрибуте значение использовалось в документе. Определения DTD можно включать непосредственно в XML-файл. Инструкции DTD размещают в начале файла в контейнере: <!DOCTYPE иыя_корня [ ]> Отметим, что блок DTD заканчивается символами ]>. Файл 2_6_3.xml. Пример с внутренним включением DTD <?xml version="1.0" encoding="windows-1251"?> <!DOCTYPE journal [ <!ELEMENT journal (jrntitle, contacts, articles)>
<!ELEMENT jrntitle (#PCDATA)> <!ELEMENT contacts (address,url)> <!ELEMENT address (#PCDATA)> <!ELEMENT url (#PCDATA)> <!ELEMENT articles (article)+> <!ELEMENT article (title, author+)> <!ATTLIST article id ID #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> ]> <!— Конец DTD определений —> <journal> <jrntitle>Lobachevskii JournaK/jrntitle> <contacts> <addres3>Kazan State University</address> <url>ljm.ksu.ru</url> </contacts> <articles> <article ID="1"> <title>MathML and TeX</title> <author>M. Malakhaltsev</author> </article> Orticle ID="2"> <title>MathML and RDF</title> <author>E. Lipachev</author> </article> </articles> </journal> Атрибуты entity и entities. Данные в XML-документах не всегда являются текстовыми — документ может содержать и двоичную информацию (например, графику). На такие данные можно ссылаться при помощи атрибута entity. Например, в описании элемента description можно указать атрибут recipePicture С графическим изображением: <!ATTLIST description recipePicture ENTITY #IMPLIED> Также можно объявить сразу несколько сущностей, заменив entity на ENTITIES. Значения разделяются пробелами. Ссылки на сущности. Концепция сущности (entity) упрощает сопровождение документа, обеспечивая возможность ссылки на некоторое содержание по ключевым словам. Сущности удобны тем, что они могут многократно использоваться в XML-документах. При последующей обработке документа все ссылки на сущность заменяются конкретным содержанием, указанным при ее объявлении. Объявление сущности включается в DTD XML-документа. В процессе обработки
XML-документа все вхождения сущности заменяются содержанием, которое она представляет. Существует два вида сущностей: внутренние и внешние. Внутренние сущности напоминают строковые переменные, связывающие имя с фрагментом текста. Например, если вы хотите определить имя для ссылки на информацию об авторских правах, можно объявить сущность следующего вида: <!ENTITY Copyright "Copyright 2000 YourCompanyName. All Rights Reserved."> В процессе обработки документа все экземпляры sCopyright; заменяются текстом «Copyright 2000 YourCompanyName. All Rights Reserved». Весь код XML в заменяющем тексте обрабатывается так, словно он присутствовал в исходном документе. Внешние сущности используются для ссылок на содержание, находящееся в другом файле. Сущности этого типа могут содержать текстовую информацию, но могут также ссылаться и на двоичные данные (например, графику). Возвращаясь к предыдущему примеру, допустим, что вы решили сохранить информацию об авторских правах в отдельном файле, чтобы упростить ее редактирование в будущем. Ссылка на созданный файл выглядит следующим образом: <!ENTITY Copyright SYSTEM "http://yoursite.com/administer/copyright.xml"> При последующей обработке XML-документа все ссылки sCopyright; заменяются содержимым документа copyright.xml. Весь код XML в заменяющем тексте обрабатывается так, словно он присутствовал в исходном документе. Внешние сущности также удобно использовать для ссылок на графические изображения. Например, если вы хотите включить в XML-документ графический логотип, создайте внешнюю сущность: <!ENTITY food_picture SYSTEM http://yoursite.com/food/logo.gif> Как и в предыдущем примере, все ссылки &food_picture; заменяются графическим изображением, на которое указывает ссылка. Поскольку данные являются двоичными, а не текстовыми, они не интерпретируются. 2.6.2. XML-схема. Другой способ осуществления контроля содержания XML-документа дает использование XML-схем, принятых консорциумом W3C в качестве рекомендации [16, 17]. Этот способ более адаптирован к XML-структуре.
XML-схема определяет: • наборы элементов и атрибутов документа; • элементы, которые могут иметь дочерние элементы; • порядок и число дочерних элементов; • является элемент пустым или может содержать текст; • типы данных элементов и атрибутов; • значения по умолчанию и фиксированные значения элементов и атрибутов. Отметим наиболее существенные свойства XML-схем. XML-схемы поддерживают типизацию данных. Это позволяет: • описывать разрешенное содержание документа; • проверять правильность данных; • работать с данными из баз данных; • задавать ограничения на данные и форматы данных; • преобразовывать данные различных типов. XML-схемы пишутся на XML. Благодаря этому: • для редактирования схем можно использовать XML-редактор; • для анализа схем можно использовать XML-napcep, т. е. программу, осуществляющую разбор выражений; • можно работать с XML-схемами посредством XML DOM; • можно преобразовывать схемы посредством XSLT. XML-схемы расширяемы (так же, как и XML), поскольку они пишутся на XML. Благодаря расширяемости каждой конкретной схемы можно: • встраивать одни схемы в другие; • создавать свои собственные типы данных на основе стандартных типов; • ссылаться в документе на несколько схем. Покажем, как описать структуру данных в XML-документе с помощью XML-схемы (отметим, что в предыдущем разделе мы решали эту задачу с помощью DTD). Сначала возьмем простейший XML-файл Файл 2 6 4.xml <?xml version= <journal> </journal> '1.0"?> XML-схема для описания этого файла имеет вид Файл 2 6 5.xsd <xsd:schema xmlns xad= <xsd:element name="j </xsd:element> </xsd:schema> "http: ournal //www "> w3 org/2001/XMLSchema">
Поясним этот пример. Как уже отмечалось, XML-схема является XML-документом, в частности, имеет корневой элемент <xsd:schema>. Этот XML-документ состоит из элементов, имена которых принадлежат пространству имен (см. параграф 2.5), идентифицированному адресом http://www.w3.org/2001/XMLSchema. Объявление пространства имен содержится в элементе schema: <xsd:schema xmlns:xsd=«http://www.w3.org/2001/XMLSchema»> Для определения элементов в XML-схеме используется элемент xsd:element. Его атрибут name задает имя соответствующего элемента. Простейшая схема 2_6_5.xsd уже позволяет организовать проверку XML-документов. Например, следующий XML-документ не пройдет проверки на соответствие указанной схеме: Файл 2 б б.хт! <?xml version="l.0"?> <рарег> </рарег> так как элемент в этом файле имеет имя paper, а не journal. Естественно, любой XML-документ, дерево которого состоит из двух и более элементов, также не пройдет проверки. Теперь рассмотрим более сложный XML-документ Файл 2 б 7.xml <?xml version="l <journal> 0"?> <jrntitle>Lobachevskii <contacts> <address>Kazan State <url>ljm.ksu </contacts> </journal> JournaK/jrntitle> University</address> ru</url> Здесь элемент journal содержит подэлементы jrntitle и contacts, причем подэлемент contacts сам содержит подэлементы address И url. Элементы, которые не содержат подэлементов и атрибутов, называются элементами простого типа. Таким образом, jrntitle, address и url — элементы простого типа. Элементы, которые содержат подэлементы и атрибуты, называются элементами сложного типа. В нашем примере это journal и contacts. Посмотрим, как описываются элементы простого и сложного типов. Описание элементов простого типа. Напомним, что для определения элементов в XML-схеме используются элемент xsd:element и его атрибут name, с помощью которого задается имя элемента.
Элемент xsd:element имеет ряд других атрибутов, позволяющих проверять значение соответствующих элементов XML-документов (подробности см. в [16, 17]), например, атрибут type позволяет указать тип данных. Значениями элементов jrntitle, address являются строки, а значением элемента url — URI (например, данные вида http://vjww.example.com/, см. параграф 2.5). Поэтому эти элементы можно объявить так: <xsd:element name="jrntitle" type="xsd:string"/> <xsd:element name="address" type="xsd:string"/> <xsd:element name="url" type="xsd:anyURI"/> Если XML-файл будет содержать элемент <url>llll</url>, то XML-процессор выдаст сообщение об ошибке, так как значение этого элемента не удовлетворяет типу anyURl. В рекомендации W3C по применению XML-схемы предусмотрено 42 простых типа данных, включая string, int, date, decimal, boolean, timeDuration, uriReference (см. [16, 17]). Другим примером ограничения, налагаемого на элемент, является ограничение числа вхождений данного элемента (в соответствующий фрагмент XML-дерева) с помощью атрибутов maxOccurs и minOccurs. В нашем примере название журнала может быть только одно, а вебсайтов несколько (допустим, не более трех). Соответствующие объявления имеют вид <xsd:element name="jrntitle" maxOccurs="l" type="xsd:string"/> <xsd:element name="address" maxOccurs="l" type="xsd:string"/> <xsd:element name="url" maxOccurs="3" type="xsd:anyURI"/> Теперь, если в XML-документе два раза встретится элемент jrntitle, то XML-процессор выдаст сообщение об ошибке. Отметим, что если атрибуты maxOccurs и minOccurs отсутствуют, то по умолчанию используется значение 1, следовательно, элемент должен входить в соответствующий фрагмент XML-дерева только один раз. В дополнение к предопределенным простым типам можно создать собственные простые типы. Они могут описывать текстовые данные в определенном формате (например, номер телефона), числовые данные, данные из предопределенного списка и т.д. Приведем несколько таких примеров. Предположим, что нам необходимо описать номер ежемесячного журнала, который может изменяться от 1 до 12. Фрагмент XML-схемы, определяющий тип issuenumber, имеет вид <xsd:simpleType name="issuenumber"> <xsd:restriction base="x3d:integer">
<x3d:minlnclu3ive value="l"/> <xsd:maxlnclusive value="12"/> </xsd: restriction </xsd:simpleType> а соответствующим описанием элемента будет <xsd:element name="issue" type="issuenumber"> Допустим, что в описании статьи надо указать ее тематику (алгебра, геометрия, математический анализ и т.п.). Тогда нам потребуется тип fieldtype, который принимает заранее определенные значения, скажем, algebra, geometry, calculus: <xsd:simpleType name="field"> <xsd:restriction base="xsd <xsd:enumeration value= <xsd:enumeration value= <xsd:enumeration value= </xsd:restriction> </xsd:simpleType> string"> 'algebra" 'geometry' 'calculus' /> /> /> Отметим, что никакого упорядочивания значений (в данном случае algebra, geometry, calculus) это описание не задает. Описание элементов сложного типа. В примере 2_6_7.xml journal и contacts являются элементами сложного типа, так как они содержат подэлементы. Последовательность подэлементов данного элемента сложного типа характеризуется с помощью элемента xsd: sequence XML-схемы. Для нашего примера описание элемента contacts можно задать так: <xsd:element name="contacts"> <xsd:sequence> <xsd:element name="address" maxOccurs="l" type="xsd:string"/> <xsd:element name="url" maxOccurs="3" type="xsd:anyURI"/> </xsd:sequence> </xsd:element> Теперь понятно, как записать XML-схему для документа 2_6_7.xml: Файл 2_6_8.xsd <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="journal"> <xsd:complexType> <xsd:sequence> <xsd:element name="jrntitle"/> <xsd:element name="contact3"> <xsd:complexType> <xsd:sequence>
<xsd:element name= <xsd:element name= </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> 'address" maxOccurs="l" type="xsd:string"/> 'url" maxOccurs="3" type="xsd:anyURI"/> В XML-схеме можно создавать собственные сложные типы. Например, можно создать сложный тип contactType: <xsd:complexType name="contactType"> <xsd:sequence> <xsd:element name="address" maxOccurs="l" type="xsd:string"/> <xsd:element name="url" max0ccurs="3" type="xsd:anyURI"/> </xsd:sequence> </xsd:complexType> и записать XML-схему для примера 2_6_7.xml в виде Файл 2 б 9.xsd <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="journal"> <xsd:complexType> <xsd:sequence> <xsd:element name="jrntitle" type="xsd:string"/> <xsd:element name="contacts" type="contactType"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="contactType"> <xsd:sequence> <xsd:element name="address" type="xsd:string"/> <xsd:element name="url" type="xsd:anyURI"/> </xsd:sequence> </xsd:complexType> </xsd:schema> Теперь можно привести схему для XML-документа 2_6_1.xml (ссылку на DTD мы убрали): Файл 2 6 10.xml <?xml ver3ion="1.0" encoding="utf-8"?> <journal> <jrntitle>Lobachevskii Journal</jrntitle>
<contacts> <address>Kazan State University</address> <url>ljm.ksu.ru</url> </contacts> <articles> <article ID="1"> <title>MathML and TeX</title> <author>M. Malakhaltsev</author> </article> <article ID="2"> <title>MathML and RDF</title> <author>E. Lipachev</author> </article> </articles> </journal> Файл 2 6 11.xsd <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="journal"> <xsd:complexType> <xsd:sequence> <xsd:element name="jrntitle" type="xsd:string"/> <xsd:element name="contacts" type="contactType"/> <xsd:element name="articles" type="articlesType"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="contactType"> <xsd:sequence> <xsd:element name="address" type="xsd:string"/> <xsd:element name="url" type="xsd:anyURI"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="articlesType"> <xsd:sequence> <xsd:element name="article" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="title" maxOccurs="l" type="xsd:string"/> <xsd:element name="author" max0ccurs="15" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="ID" type="xsd:int"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:schema> Конструкции схемы были объяснены выше, осталось лишь указать, что элемент article в XML-документе 2_6_10.xml имеет атрибут
ID, который принимает целые значения. Соответствующее объявление в XML-схеме 2_б_1 l.xsd имеет вид <xsd:attribute name="ID" type="xsd:int"/> причем оно помещено после объявления подэлементов элемента article. Отметим, что элемент, имеющий атрибут, необходимо имеет сложный тип, независимо от того, есть у него подэлементы или нет. Приведем пример файла, не удовлетворяющего XML-схеме 2_6_1 l.xsd. Файл 2 6 12.xml <?xml version="l <journal> 0" encoding="utf-8"?> <jrntitle>Lobachevskii JournaK/jrntitle> <contacts> <address>Kazan State University</address> <address>Saratov State University</address> <url>ljm.ksu </contacts> <articles> <article ID= ru</url> 'A"> <title>MathML and TeX</title> <title>TeX <author>M. </article> <article ID= and MathML</title> Malakhaltsev</author> '2"> <title>MathML and RDF</title> <author>E </article> </articles> </journal> Lipachev</author> XML-процессор выдаст сообщение об ошибках, которые возникли в силу следующих причин: • два раза встречается элемент address; хотя в XML-схеме не установлен атрибут MaxOccurs, по умолчанию элемент address может входить точно один раз; • атрибут ID установлен в значение А; в XML-схеме его тип определен как целое число; • элемент title два раза входит в элемент article; в XML-схеме с помощью атрибута MaxOccurs указано, что этот элемент может встречаться не более одного раза; • во втором элементе article вначале идет элемент title, а затем author; в XML-схеме описан другой порядок следования подэлементов элемента article: вначале элемент author, а затем — title. Этот пример иллюстрирует, какие элементы структуры XML-документов могут быть регламентированы с помощью XML-схемы.
Отметим, что разработаны программные средства, автоматически 1ерирующие XML-схему по данному XML-документу. Например, с nor щью расширения XML Developer браузера Firefox можно получить гдующую XML-схему для документа 2_6_10.xml: : Файл 2 6 13.xsd <?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="address"> <xs:complexType mixed="true" /> </xs:element> <xs:element name="article"> <xs:complexType> <xs:sequence> <xs:element ref="title" /> <xs:element ref="author" /> </xs:sequence> <xs:attribute name="ID" type="xs:integer" use ="required" /> </xs:complexType> </xs:element> <xs:element name="articles"> <xs:complexType> <xs:sequence> <xs:element ref="article" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="author"> <xs:complexType mixed="true" /> </xs:element> <xs:element name="contacts"> <xs:complexType> <xs:sequence> <xs:element ref="address" /> <xs:element ref="url" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="journal"> <xs:complexType> <xs:sequence> <xs:element ref="jrntitle" /> <xs:element ref="contacts" /> <xs:element ref="articles" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="jrntitle"> <xs:complexType mixed="true" /> </xs:element> <xs:element name="title"> <xs:complexType mixed="true" /> </xs:element> <xs:element name="url">
<xs:complexType mixed="true" /> </xs:element> </xs:schema> В этой XML-схеме используется ссылка на элементы, заданная атрибутом ref. Значение этого атрибута должно быть глобальным элементом, который был объявлен в элементе schema, а не частью определения комплексного типа. Например, элемент article содержит подэлементы title, article и атрибут ID. С помощью атрибута ref этот элемент может быть описан следующим фрагментом XML-схемы: <xs:element name="article"> <xs:complexType> <xs:sequence> <xs:element ref= <xs:element ref= </xs:sequence> <xs: attribute name* use="required" </xs:complexType> 'title" 'author /> ' /> ="ID" type="xs /> integer" Здесь идет ссылка на элементы title и author, которые определены в той же XML-схеме: <xs:element name="title"> <xs:complexType mixed="true" </xs:element> <xs:element name="author"> <xs:complexType mixed="true" </xs:element> /> /> Стоит отметить, что модуль программы XML Developer, который сгенерировал данную XML-схему автоматически, задал данные элементы как элементы сложного типа, допускающие любые сочетания элементов и текста (это задано значением true атрибута mixed). Однако в нашем примере эти элементы имеют тип string, поэтому можно заменить их определение на определение простых элементов: <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> При таком изменении XML-схемы документ journal.xml останется правильным. Ссылка на XML-схему в XML-документе. Отметим, что выбор XML-схемы для проверки XML-документа полностью зависит от программы, его проверяющей. Например, программа может проверять XML-документ, не содержащий ссылок на XML-схему, на соответствие
некоторой XML-схеме или игнорировать ссылку на такую схему и не производить проверки. Так, браузер Firefox не сообщает об ошибке в XML-документе, содержащем ссылки на XML-схему, которой этот документ не удовлетворяет. А упоминавшееся расширение XML Developer осуществляет проверку XML-документа, не содержащего ссылки на XML-схему, при этом XML-схема указывается пользователем. Тем не менее, рекомендацией W3C [17] предусмотрен механизм ссылки на XML-схему в XML-документе, т. е. в этом документе можно указать, какую XML-схему нужно для него использовать. Для этого применяются следующие атрибуты корневого элемента: SchemaLocation и noNamespaceSchemaLocation. Атрибут SchemaLocation используется для ссылки на XML-схему, если мы хотим рассматривать имена элементов и атрибутов, определенных ею, принадлежащими некоторому пространству имен (называемому целевым пространством имен XML-схемы). Целевое пространство имен в XML-схеме определяется с помощью атрибута targetNamespace. Например, в следующем фрагменте целевое пространство имен имеет имя http://www.journal.org, и ему принадлежат имена author и title: <xsd:schema targetNamespace='http://www.journal.org' xmlns:xsd='http://www.w3.org/1999/XMLSchema' xmlns:x= 'http://www.journal.org'> <xsd:element name='author' type='xsd:string'/> <xsd:element name='title' type='xsd:string'/> Атрибут SchemaLocation используется в XML-документе следующим образом — он содержит набор пространств имен и указаний на расположение схемы, разделенных пробелом: <journa xmlns xmlns xsi: s 1 xmlns="http :ns2="http :xsi="http //www journal.org" //www.journal2.com" //www.w3 ;hemaLocation= http://www ="http org/2001/XMLSchema-instance" //www.journal.org journal2.com example2 example xsd"> xsd Здесь введены пространства имен http://www.journal.org и http://www.journal2.com, которые состоят из имен элементов и атрибутов, определенных в XML-схемах example.xsd и example2.xsd соответственно. Атрибут noNamespaceSchemaLocation используется для того, чтобы ссылаться на XML-схемы, в которых не определено целевое пространство имен: <journal xmlns="http://www.example.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="example.xsd">
Атрибут noNamespaceSchemaLocation может содержать только ссылку на файл схемы и не может содержать uri, идентифицирующий пространство имен. Еще раз отметим, что значения атрибутов schemaLocation и noNamespaceSchemaLocation не являются обязательными для XML-процессора. Теперь возьмем пример 2_6_12.xml и переделаем его так, чтобы он ссылался на XML-схему 2_6_13.xsd. Файл 2 6 14.xml <?xml version="l.О" encoding="utf-8"?> <journal xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='2_6_13.xsd'> <jrntitle>Lobachevskii JournaK/jrntitle> <contacts> <address>Kazan State University</address> <url>ljm.ksu.ru</url> </contacts> <articles> <article ID="1"> <title>MathML and TeX</title> <author>M. Malakhaltsev</author> </article> <article ID="2"> <title>MathML and RDF</title> <author>E. Lipachev</author> </article> </articles> </journal> Изменение состоит в том, что в элементе journal объявлено пространство имен с указанием XML-схемы: <journal xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation^'Schema_3.xsd'> 2.7. XSL-преобразование XML-документов Как видно из приведенных примеров, язык XML совершенно не «заботится» о представлении информации, поскольку разработан для других целей. Для отображения информации в «привычном» виде необходимо использовать другие технологии, например, таблицы каскадных стилей (CSS). Универсальным механизмом управления отображением XML-документов является расширяемый язык таблиц стилей XSL (extensible Stylesheet Language). С помощью XSL можно трансформировать XML-документ в любой формат, например, HTML, WML, RTF, PDF
и SQL. На языке XSL можно описать, как будет оформлен итоговый документ, где и как должны располагаться данные. Спецификация XSL [18] состоит из двух частей: XSL-T (XSL Transformations) — язык для преобразования XML-документов и XSL- FO (XSL Formatting Objects) — язык для верстки XML. XSL-FO является языком разметки, который предназначен для описания внешнего вида (макета) документа. Не останавливаясь подробно на XSL-FO, отметим только, что схематически использование этого языка можно описать следующим образом. Берется документ на любом языке, являющемся подмножеством XML, например, XHTML или DocBook. Затем применяется соответствующее XSLT-преобразование, в результате получается XSL-FO-до- кумент. Последний передается приложению (FO-процессору), которое конвертирует XSL-FO-документ в какой-либо читаемый и/или печатаемый формат, например, PDF, PS, RTF, или выводит его на монитор. Перейдем к описанию XSLT и начнем с простых примеров. Создадим таблицу стилей для отображения файла 2_4_1.xml и сохраним ее в XSL-файле. Файл 2 7 l.xsl <xsl:stylesheet xmlns:xsl=" <xsl:template <h2> <xsl: value- </h2> <hr/> <P> <IXxsl:va </p> <P> <xslrvalue </p> version="l http://www match="/"> -of select= 0" w3 41- Lue-of select=' -of select= </xsl:template> </xsl:stylesheet> org/1999/XSL/Trans rntitle"/> '//contacts/address V/contacts/url"/> form"> "/></!> Теперь в файл 2_4_1.xml добавим следующую ссылку на файл 2 7 I.xml: <?xml-stylesheet type='text/xsl' href='2_7_1.xml'?> и получим новый документ: Файл 2 7 2.xml <?xml version="1.0"?> <!— ссылка на XSL-таблицу —> <?xml-stylesheet type='text/xsl' href='2_7_l.xsl'?>
<journal> <jrntitle>Lobachevskii Journal</jrntitle> <contacts> <address>Kazan State University</address> <url>ljm.ksu.ru</url> </contacts> <articles> <article ID="1"> <title>MathML and TeX</title> <author>M. Malakhaltsev</author> </article> <article ID="2"> <title>MathML and RDF</title> <author>E. Lipachev</author> </article> </articles> </journal> ) D:\2_7_biml - Windows Int.. СЭЯ т=шшА у \ u_, D:V2_7_l.xml - \h \X \£ Избранное , rS D-UJJLxml m- «l- a Если теперь мы откроем файл 2_7_2.xml в браузере Internet Explorer, то получим «привычную» форму представления документа (рис. 2.4). На этом примере поясним принципы работы XSL-преобразований. Преобразование исходного XML-документа (в нашем случае 2_7_1.xml) с помощью таблицы стилей (в нашем случае 2_7_1.xsl) осуществляется программным модулем, который называется «XSLT-процессор». Большинство современных браузеров имеет встроенные XSLT-процессоры, позволяющие «на лету» осуществлять XSL-преобразование, т.е. производить XSL-преобразование исходного XML-документа в соответствии с заданной таблицей стилей и передавать полученный документ другому модулю браузера для вывода на экран. В результате пользователь, открывая в браузере XML-документ, содержащий ссылку на таблицу стилей, видит документ, определяемый этой таблицей. Таким образом, один и тот же XML-документ может быть показан в браузере различными способами (см. примеры ниже). Отметим, что отображение информации в браузере — только одна из задач, для решения которых может быть применено XSL-преобразование XML-документов. XSLT является языком, с помощью которого можно обеспечить произвольную трансформацию XML-документов. Поэтому XSLT-процессоры включены в интерпретаторы языков, применяемых в веб-программировании (например, PHP, Java, JavaScript). Lobachevskii Journal Kazan State University ljmJcsu.ra i% Компьютер | Защищенный режи <% ' Рис. 2.4. «Привычная» форма представления документа в браузере Internet Explorer
В ОС Linux XSLT-процессор содержит, например, библиотека libxml. Он может быть вызван в консоли командой: xsltproc one.xsl example.xml Кратко опишем алгоритм работы XSL-преобразования (детальное описание см. в [19, 20]). Имеются исходный XML-файл (исходное дерево) и таблица стилей, содержащая набор правил шаблона. Правило шаблона состоит из двух частей: образца, который сопоставляется с узлами в исходном дереве, и шаблона, который может быть обработан для формирования фрагмента в конечном дереве. В ходе XSL-преобразования образец сравнивается с элементами исходного дерева, а шаблон используется для создания частей конечного дерева. Отметим, что структура конечного дерева может полностью отличаться от структуры исходного дерева: в ходе построения конечного дерева элементы исходного дерева могут подвергаться фильтрации и переупорядочению, также может быть добавлена новая структура. Чтобы в конечном дереве построить фрагмент, обрабатывается перечень исходных узлов. Обработка узла осуществляется путем нахождения всех правил шаблона, чей образец соответствует этому узлу, а затем выбора среди них самого «лучшего» и последующего применения к узлу инструкций выбранного шаблона (правила, по которым выбирается лучший шаблон, см. в [19, 20]). Этот процесс продолжается до тех пор, пока для обработки можно найти новые исходные узлы. Посмотрим, как этот алгоритм работает в нашем примере. Начнем с таблицы стилей 2 7 l.xsl. Она является XML-файлом с корневым элементом <xsl:stylesheet version="l. 0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> Его атрибуты — номер версии и ссылка на пространство имен (xmlnsrxsl) — являются обязательными. Как было сказано, таблица стилей состоит из правил шаблона, которые задаются элементами xsl: template. При этом образец для выбора узлов XML-дерева, к которому будет применяться шаблон, задается атрибутом match, а шаблон является значением этого элемента. Таблица стилей 2 7 1 .xsl содержит одно правило шаблона: <xsl:template match="/"> <h2> <xsl:value-of select="//j rntitle"/> </h2> <hr/> <p>
<i><xsl:value-of select="//contacts/address"/X/i> </p> <p> <xsl:value-of select="//contacts/url"/> </p> </xsl:template> Образцом в этом правиле является "/", а самим шаблоном — значение элемента <xsl:template>, т.е. <h2> <хз1 </h2> <hr/> <р> value- -of <i><xsl: value- </р> <P> <xsl </р> value- -of select= "//jrntitle"/> -of select= select= '//contacts/address V/contacts/url"/> •/></!> Образец шаблона является выражением, написанным на языке Xpath, который предназначен для адресации узлов (и подмножеств узлов) XML-дерева. Здесь нет возможности подробно описать синтаксис и применения языка Xpath, поэтому ограничимся тем, что приведем несколько простых примеров выражений. Подробно об этом языке можно узнать из рекомендаций W3C [21] (см. также руководство [22]). Отметим, что в 2007 г. завершилась разработка версии 2.0 языка XPath, который теперь является составной частью языка XQuery. Примеры выражений на языке Xpath приведены в следующей таблице. Выражение paper /paper paper/title //paper journal//author //@lang Результат Выбирает всех прямых потомков узла paper Выбирает элемент paper, являющийся прямым потомком корневого узла. Замечание: если выражение начинается с /, то оно описывает абсолютный путь к элементу Выбирает все узлы title, являющиеся прямыми потомками paper Выбирает все узлы paper, независимо от того, где этот элемент находится в дереве Выбирает все элементы author являющиеся потомками элементов journal Выбирает все атрибуты с именем lang
В нашем примере значение "/" атрибута match определяет, что шаблон будет применяться ко всем элементам XML-дерева. Теперь перейдем к инструкциям шаблона. Вначале идет текстовый узел <Ь2>. Каждый текстовый узел в шаблоне создаст в конечном дереве текстовый узел с тем же самым строковым значением. Далее идет элемент xsl:value-of select="//jrntitle"/. Он позволяет получить значение элемента исходного XML-документа, определяемого значением атрибута select, т.е. "//jrntitle" (отметим, что значениями этого атрибута являются XPath-выражения). В нашем примере в результирующее дерево будет записано значение элемента <jrntitle> Lobachevskii JournaK/jrntitle> исходного XML-дерева из файла 2_7_1.xml, т.е. Lobachevskii Journal Применение остальных инструкций шаблона происходит аналогично, в результате получается документ <html> <body> <h2>Lobachevskii Jou <hr> <p><i>Kazan <p>ljm.ksu. </body> </html> State ru</p> Un rnal</h2> iversity</ ix/p> который отображается браузером. Теперь покажем, как, изменив стилевую таблицу, можно из того же самого файла 2_7_1.xml получить файл, содержащий список авторов журнала. Возьмем сначала стилевую таблицу <xsl:stylesheet version xmlns:xsl='http:// <xsl:template match=" <xsl:value-of select </xsl:template> </xsl:stylesheet> ="1.0" www.w3.о /Varticl ="author rg/1999/XSL/Transform'> 2"> 7> Она содержит одно правило шаблона, образцом является //article, поэтому можно предположить, что результирующий документ будет представлять собой список авторов: М. Malakhaltsev Е. Lipachev На самом деле, мы получим следующий документ:
<?xml version="1.0"?> Lobachevskii Journal Kazan State University ljm.ksu.ru M. Malakhaltsev E. Lipachev Дело в том, что для узлов, которые не удовлетворяют ни одному образцу, применяется шаблон по умолчанию, который отображает только содержимое соответствующих элементов исходного XML-файла. Если же применить следующую таблицу стилей: <xsl:stylesheet version xmlns:xsl='http:// <xsl:template match=' </xsl:template> <xsl:template match=' <xsl:value-of select </xsl:template> </xsl:stylesheet> ="1.0" www.w3.01 /"> //article ="author' g/1999/XSL/Trans "> /> form'> которая содержит два шаблона, то для элементов article возникнет конфликт шаблонов, так как этот элемент удовлетворяет двум образцам. Этот конфликт разрешается в пользу первого шаблона — «ничего не делать» (подробно о разрешении конфликтов шаблонов и о том, как выйти из этой ситуации, см. [20]). Для того чтобы все же получить список авторов, можно попытаться применить следующее правило: <xsl:stylesheet version= '1 xmlns:xsl='http://www <xsl:template match="/ <xsl:value-of select= </xsl:template> </xsl:stylesheet> •> 0" w3 org '//articl /1999/XSL/Trans e/author '/> form'> Однако результатом будет документ, содержащий только первого автора: М. Malakhaltsev Причина в том, что к корневому элементу применяется шаблон, который указывает, что надо вывести содержимое элемента, определяемого выражением //article/author. Однако таких элементов в данном случае два, и нет указаний, какой из них надо выбрать. Поэтому выбирается первый. Для того чтобы вывести список всех авторов, применяется элемент xsl:for-each, дающий инструкцию осуществить обработку каждого элемента из набора элементов, определенного атрибутом select,
значением которого является XPath-выражение. В данном случае стилевая таблица будет иметь вид <xsl:stylesheet version="l.0" xmlns:xsl='http://www.w3 <xsl:template match="/"> <xsl:for-each select="//art <P> <xsl:value-of select= </p> </xsl:for-each> </xsl:template> </xsl:stylesheet> 'au .org/1999/XSL/Trans icle"> thor' /> form'> При применении этого шаблона последовательно обрабатываются ветви XML-дерева, начинающиеся с элементов article, и для каждой из них выводится содержимое элемента author. Приведем еще несколько примеров XSLT-преобразований для вывода информации, содержащейся в файле 2_7_2.xml в разных видах. Файл 2 7 3.xsl <xsl:stylesheet version="l.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2> <xsl:value-of select="journal/jrntitie"/> </h2> <hr/> <xsl:for-each select="journal/articles/article"> <p> <xsl:value-of select="title"/xbr/> <i><xsl: value-of select="author"/x/i> </p> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> Теперь при открытии файла 2_7_2.xml (конечно, если вместо ссылки на XSL-таблицу 2_7_1.xsl указана ссылка на XSL-таблицу 2_7_3.xsl) в браузере мы увидим картинку, представленную на рис. 2.5. Если в файле 2_7_3.xsl изменить тег, начинающийся со слов <xsl:for-each... , на <xsl:for-each select="journal/articles/article" orderby="author">, то перед выводом на экран статьи будут упорядочены по авторам. Критерий сортировки задается атрибутом order-by, при этом символ «;» используется как разделитель, если критериев несколько.
Щ СЛ2 7_Zxml - Windows Irit- \щШШШШ\ Blb;„D:X2-7-2^L **\x\ & Избранное | ф Jg " (Sj - a- Lobachevskii Journal MathML and TeX M. Malakhaltsev MathML and RDF E. Lipachev f$ Компьютер | Защищенный режи -*jj ^ Рис. 2.5. Результат открытия файла 2_7_2.xml в браузере Следующий стилевой файл используется для отображения документа 2_7_2.xml в виде таблицы. Обратите внимание на русские названия ее столбцов. Для этого в XSL-файле с помощью атрибута encoding указана кодировка символов. Файл 2 7 4.xsl <?xml version="l.О" encoding="windows-1251"?> <xsl:stylesheet version="l.О" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2> <xsl:value-of select="journal/jrntitie"/> </h2> <bxxsl:value-of select="journal/contacts/url"/> </b> <hr/> <table border="l"> <tr> <td> Название </tdxtd> Авторы </td> </tr> <xsl:for-each select="journal/articles/article"> <tr> <tdxxsl: value-of select="title"/x/td> <tdxixxsl:value-of select="author"/X/i></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Результат этого преобразования имеет вид, представленный на рис. 2.6. :/£ пу_У7у£Г.^п^ГИ^Йм£^каАВ||ИВЙГ J ГШ 7 2jcml ч** х few •Й Избранное | ^ jg ' (Bj " Й Р:\2.7.2лт1 Г I S - Lobachevskii Journal ljm.ksu.ru [Название |Авторы JMathMLand ТеХ \м. Malakhaltsev |МагЬМ1 andRDF \E. Lipachev [ф Компьютер 1 Защищенный ^а ^ ^100% Рис. 2.6. Вид преобразованного файла Для продвинутого читателя. Элементы и управляющие конструкции языка XSLT на примерах Язык XSLT имеет все управляющие конструкции языков программирования, например, как мы видели, элемент xsl:for-each задает оператор цикла. В этом разделе мы приведем наиболее распространенные конструкции XSLT. Будем применять XSLT-преобразования к XML-документу (при этом в файле 2_7_5.xml, конечно, надо заменить ссылку на XSL-таблицу, если вы просматриваете XML-документ в браузере). Файл 2 7 5.xml <?xml version="l.0"?> <!— ссылка на ХЭЬ-таблицу —> <?xml-stylesheet type='text/xsl' href='2_7_6.xsl'?> <journal> <jrntitle>Lobachevskii Journal</jrntitle> <contacts> <address>Kazan State Oniversity</address> <url>ljm.ksu.ru</url> </contacts> <articles> <article ID="1"> <title>MathML and TeX</title> <author>M. Malakhaltsev</author> </article> <article ID="2"> <title>MathML and RDF</title> <author>E. Lipachev</author>
</article> <article ID="3"> <title>MathML and XML Schema</title> <author>A. Elizarov</author> </article> </articles> </journal> Элемент xsl:value-of используется для вывода содержимого элемента; Элемент xsl:text в основном используется для вывода литералов; Элементы xsl:element, xsl:attribute используются для включения элементов и их атрибутов в результирующий документ. Примером применения этих элементов служит следующий стилевой файл: Файл 2 7 6.xsl <xsl:stylesheet version="l.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="journal"> <html> <body> <xsl:element name="h3"> <xsl:attribute name="align' ■>center</xsl <xsl:text>Journal Title</xsl:text> </xsl:element> <xsl:element name="p"> <xsl:value-of select="jrntitle"/> </xsl:element> </body> </html> </xsl:template> </xsl:stylesheet> attribute> Если преобразовать 2_7_2.xml с помощью этого стилевого файла, то получим HTML-файл Файл 2 7 7.html <html> <body> <h3 align="center">Journal Title</h3> <p>Lobachevs ki i </body> </html> Journal</p> Элемент xsl:for-each осуществляет обработку каждого элемента из набора элементов, определенного атрибутом select. В качестве примера рассмотрим стилевой файл
Файл 2 7 8.xsl <xsl:stylesheet version= = "1.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform' > <xsl:template match="/ <xsl:for-each select=' '> ' journal/articles/article"> <xsl:value-of select="@ID"/> <xsl:text>. </xsl text> <xsl:value-of select="author"/> <!— перевод на новую <xsl:text>; </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> строку после точки с запятой —> Если преобразовать 2_7_2.xml с помощью этого стилевого файла, то получим текстовый файл Файл 2 7 9.txt 1. М. Malakhaltsev; 2. Е. Lipachev 3. A. Elizarov Обратите внимание, как с помощью элемента xsl:text мы добились того, чтобы в текстовом файле после точки с запятой стоял непечатаемый символ конца строки. Элемент xsl:if используется для выбора по содержимому элементов; атрибут test равен выражению языка XPath. Рассмотрим теперь стилевой файл Файл 2 7 10.xsl <xsl:stylesheet version="l.0" xmlns:xsl='http://www.w3.org/1999/XSL/Trans <xsl:template match="/"> <xsl:for-each select="journal/articles/article <xsl:if test="@ID Sgt; <xsl:value-of select= 1"> = "author"/> <xsl:text> </xsl:text> <xsl:value-of select= </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet> ="title"/> form'> '■> Элемент xsl:if имеет атрибут test, который определяет некое выражение. Содержимое элемента является шаблоном. При обходе ветвей дерева, соответствующих образцу journal/articles/article, указанное выражение обрабатывается, а полученный объект преобразуется в булево значение. Если результатом является true, то подставляется шаблон,
имеющийся в выражении. В противном случае не создается ничего. В стилевом файле 2_7_10.xsl проверяется, является ли атрибут ID элемента article большим единицы. Если да, то выводятся соответствующие значения элементов author и title. В результате получаем текстовый файл Файл 2_7_11.txt E.Lipachev MathML and RDFA.Elizarov MathML and XML Schema Обратите внимание, что конец первой записи слился с началом второй. Это не удивительно, ведь в стилевой таблице не указано, что надо ставить перевод строки после title или перед author. XSLT поддерживает более 100 функций, позволяющих работать со строками, числами, логическими выражениями, узлами дерева XML-документа и т. п. (эти функции являются общими для XSLT, XPath и XQuery). В следующем примере мы делаем список авторов, разделенный запятыми, а в конце ставим точку. Отметим, что здесь используются функции узлов дерева position() и last(), а также логическая функция not(). Файл 2 7 12.xsl <xsl:stylesheet version= 4.0" xmlns:xsl='http://www.w3.org/1999/XSL/Trans <xsl:template match="/"> <xsl:for-each select=" <xsl:value-of <xsl:if test=' <xsl:text>, </xsl:if> <xsl:if test=' <xsl:text> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet> select 'not (po </xsl journal/articles/article ="author"/> sition()=last())"> :text> position()=last()"> </xsl: text> form'> '> Получаем файл Файл 2 7 13.txt M. Malakhaltsev, E. Lipachev, A. Elizarov. Элемент xsl: choose применяется для выбора с рядом условий. Атрибут test равен выражению языка XPath. Используется функция substring, выделяющая подстроку из строки. Файл 2_7_14.xsl <xsl:stylesheet version-"1.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/"> <xsl:for-each select="journal/articles/articlen> <xsl:choose> <xsl:when test="substring(author,1,2)='M.'"> <xsl:text>First author </xsl:text> </xsl:when> <xsl:when test="substring(author,1,2)='E.'"> <xsl:text>Second author </xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>Other authors</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> </xsl:stylesheet> В результате получаем текстовый файл Файл 2_7_15.txt First author Second author Other authors Элемент xsl:sort. Атрибут select — поле сортировки, lang — язык (латиница — en, кириллица — ru), order — возрастание или убывание. Файл 2 7 16.xsl <xsl:stylesheet version="l xmlns:xsl='http://www <xsl:template match="/"> 0" w3 org/1999/XSL/Transform'> <xsl:for-each select="journal/articles/article"> <xsl:sort select="author <xsl:value-of select=' ' order=' author"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> ascending"/> В результате получаем текстовый файл Файл 2 7 17.txt A. Elizarov E. Lipachev M. Malakhaltsev Приведенные примеры показывают, что язык XSLT является удобным средством обработки информации, структурированной с помощью XML; с его помощью можно решать достаточно широкий круг задач, связанных с представлением информации в различных формах.
2.8. Метаданные и RDF Метаданные — это информация о данных. Зачем нужны метаданные? Дело в том, что непосредственная обработка информации, находящейся в распоряжении современного общества, превосходит возможности не только отдельного человека, но и мощнейших компьютерных систем. Такая ситуация сложилась не сегодня и даже не вчера, например, когда количество математических журналов стало настолько большим, что для исследователей стало невозможным даже просматривать их оглавления, — появились реферативные журналы по математике (например, реферативный журнал Zentralblatt fur Mathematik был основан еще в 1931 г.; во время написания данной книги база этого журнала содержала около 2,8 млн записей о математических статьях, начиная с 1868 г.). Стоит вспомнить здесь и об отделах научно-технической информации, появившихся в 1970-е гг. в советских НИИ. В научной работе приходится ежедневно сталкиваться с метаданными: библиографическое описание книг, рефераты статей, аннотации, ключевые слова, классификаторы — все это метаданные. Но даже если вы далеки от научной сферы, то все равно постоянно имеете дело с метаданными, например, когда читаете информацию о записях на ауди- одисках или просматриваете краткое содержание фильмов в телепрограмме. Собственно сама телепрограмма — это тоже метаданные. Скорее всего, на вашем персональном компьютере уже так много файлов, что возникает проблема поиска нужного из них. Поэтому вы стараетесь называть файлы информативными именами, например, отчетное или flOKyMeHTbi_2009.txt, а не 118x97.txt, не правда ли? Следовательно, вы неявно используете свою схему метаданных, даже если впервые узнали это слово из нашей книги! Впрочем, сейчас уже невозможно обойтись такими простыми решениями: слишком уж сложной и разветвленной является информационная структура современного общества. Для продвинутого читателя. Метаданные используются также для оптимизации алгоритмов сжатия с потерей качества. Например, если к видео прилагаются метаданные, позволяющие компьютеру разделить изображение на основную и фоновую части, то последняя может быть сжата сильнее, что позволит в результате достичь большего коэффициента сжатия. С помощью метаданных можно указать способ представления данных. Например, если к изображению прилагаются метаданные, содержащие информацию о том, какая часть изображения наиболее важная (допустим, изображение человека), то программа для просмотра изображений на маленьком экране (как на мобильном телефоне) может отобразить только эту наиболее важную часть изображения. Логическим развитием технологий работы с метаданными на современном этапе стал семантический веб, описанный в главе 8.
Представление о работе семантического веба дает следующий пример, приведенный в Википедии. «Основной задачей, решаемой с помощью метаданных, является задача поиска. Метаданные используются для повышения качества поиска. Поисковые запросы, использующие метаданные, могут избавить пользователя от лишней ручной работы по фильтрации. Информируя компьютер о том, какие элементы данных связаны и как эти связи учитывать, становится возможным осуществлять достаточно сложные операции по фильтрации и поиску. Например, если поисковая система «знает» о том, что «Ван Гог» является «голландским художником», то она может выдать в ответ на запрос о голландских художниках веб-страницу о Ван Гоге, даже если слова «голландский художник» не встречаются на этой странице. Такой подход, называемый представлением знаний, находится в сфере интересов Семантической паутины и искусственного интеллекта». В настоящем разделе мы познакомимся с одним из кирпичиков семантического веба — инфраструктурой RDF, которая предназначена как раз для описания метаданных и тесно интегрирована с XML-технологиями. 2.8.1. Основные понятия. Resource Description Framework (RDF) или среда описания ресурсов сети — это спецификация консорциума W3C для создания моделей, описывающих совокупности данных (ресурсов) интернета с учетом их структуры [23]. Эта спецификация определяет правила описания ресурсов и язык для работы с этими описаниями. Спецификация RDF разработана исключительно для взаимодействия компьютерных программ между собой и не имеет средств отображения информации для людей. RDF предоставляет модель данных, которая проста в обработке приложениями и не зависит от конкретной реализации синтаксиса. Для описания этой модели введем соответствующие понятия. Ресурс — любой объект, имеющий URI (см. параграф 2.5). С формальной точки зрения в среде RDF ресурс однозначно характеризуется своим URI. Литерал — строка символов. Триплет — упорядоченная тройка ресурсов и литералов, элементы которой называются последовательно субъект, предикат и объект (элементы триплета называют иногда «ресурс», «свойство ресурса» и «значение свойства», однако мы не будем использовать эту терминологию). Субъект и предикат — ресурсы, объект — ресурс или литерал. Триплет предназначен для описания свойств данных в сети. Например, пусть Alexander Vassiljev — автор статьи, выставленной в сети по адресу http://a.b.org. Этот факт может быть описан триплетом http://a.b.org, article:author, "Alexander Vassiljev".
Здесь http: //a.b.org и article:author являются URI, a Alexander Vassiljev — литералом. Набор триплетов называют RDF-графом (набором данных RDF, RDF-хранилищем и т.п.). Визуально RDF-граф может быть представлен в виде диаграммы узлов и направленных дуг, в которой каждый триплет представляется в виде связи узел-дуга-узел, однако для машинной обработки больше подходит представление RDF-графа на языке XML. Приведем пример: опишем номер журнала, состоящий из двух статей J.Smith «Something», A. Parrot «Anything», которые расположены по адресам www.journal.org/volume1/a.html, www.journal.org/volume1/b.html. Данный номер может быть описан с помощью следующего RDF-графа, состоящего из триплетов. Файл 2 8 l.rdf <www journal. journal <www org/volumel/a author, "J. Smith' journal. journal <www titl journal. journal <www org/volumel/a e, "Something' org/volumel/b html, > html, > html, author, "A. Parrot"> journal. journal titl org/volumel/b html, e, "Anything"> Этот RDF-граф может быть описан с помощью следующего XML-файла. Файл 2 8 2.xml <?xml version="l.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntaxns#" xmlns:journa1="http://www.journal#"> <rdf:Description rdf:about="www.journal.org/volumel/a.html"> <journal:author>J. Smith</journal:author> <journal:title>Something</journal:title> </rdf:Description> <rdf:Description rdf:about="www.journal.org/volumel/b.html"> <journal:author>A. Parrot</journal:author> <journal:title>Anything</journal:title> </rdf:Description> </rdf:RDF> Первая строка этого RDF-документа — XML-декларация. Затем идет корневой элемент RDF-документа rdf:RDF. Пространство имен xmlns:rdf определяет, что элементы с префиксом rdf берутся из пространства имен «http://www.w3.org/1999/02/22-rdf-syntax-ns#».
Пространство имен xmlns: journal определяет, что элементы с префиксом journal берутся из пространства имен http://www. journal*. Элемент rdf: Description содержит описание ресурса, идентифицированного атрибутом rdf:about. Ресурс www.journal.org/volumel/a.html имеет свойства journal:author и journal:title (ресурсы), которые принимают соответственно значения: литералы J. Smith и Something. Проверить, отвечает ли созданный RDF-файл установленным правилам, можно с помощью программы-валидатора RDF (http://www.w3.org/RDF/Validator/). Помимо проверки валидатор записывает модель данных в виде последовательности триплетов и строит RDF-граф (рис. 2.7). Рис. 2.7. Модель данных в виде последовательности триплетов и RDF-граф, построенные валидатором Последовательность триплетов, соответствующая файлу 2_8_2.xml, имеет вид Triplet 1 Subject: http://www.w3.org/RDF/Validator/run/www.journal.org/ volumel/a.html Predicate: http://www.journal!author Object: "J. Smith" Triplet 2 Subject: http://www.w3.org/RDF/Validator/run/www.journal.org/ volumel/a.html Predicate: http://www.journal#title Object: "Something" Triplet 3 Subject: http://www.w3.org/RDF/Validator/run/www.journal.org/ volumel/b.html Predicate: http://www.journal#author
Object: "A. Parrot" Triplet 4 Subject: http://www.w3.org/RDF/Validator/run/www.journal.org/ volumel/b.html Predicate: http://www.journal#title Object: "Anything" В предыдущем примере для описания RDF-графа мы использовали XML-синтаксис для RDF (http://www.w3.org/TR/rdf-syntax-gramrriar/). Опишем этот синтаксис подробнее. 2.8.2. Основные элементы RDF/XML. rdf:RDF Это корневой элемент, определяющий, что данный XML-документ является RDF-документом. Он также содержит ссылку на пространство имен RDF. Синтаксис: <?xml version= <rdf:RDF xmlns:rdf= </rdf:RDF> '1.0"?> 'http //www w3 org/1999/02/22- -rdf- -syntax- -ns# '> rdf: Description Этот элемент описывает набор триплетов с данным субъектом. Субъект триплета (ресурс) идентифицируется с помощью атрибута about. Предикат триплета описывается с помощью тега, а объект триплета — как содержимое соответствующего тега. Синтаксис: <rdf:Description rdf:about="URI"> <PROPERTY_l> OBJECT_1</PROPERTY_l> <PROPERTY_N> OBJECT_N</PROPERTY_N> </rdf:Description> Это описание эквивалентно набору триплетов (URI,PR0PERTY_1,0BJECT_1) (URI,PROPERTY_N,OBJECT_N) В следующем примере Файл 2_8_3.xml <?xml version="1.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:journal="http://www.jrn#">
<rdf:Description rdf:about="www.jrn.org/vl/pl .html"> <journal:author>J. Smith</journal:author> <journal:title>Something</journal:title> </rdf:Description> </rdf:RDF> объектом является ресурс, идентифицированный URI вида www.jrn.org/vl/pl.html, предикатами — journal:author, journal:title, а объектами — J. Smith и Something. Обратите внимание, что предикаты задаются URI из пространства имен «journal="http: //www. journal#">>. Соответствующие триплеты имеют вид Subject Predicate Object www.jrn.org/vl/pl.html http://www.jrn#author "J. Smith" www.jrn.org/vl/pl.html http://www.jrn#title "Something" Синтаксис RDF/XML позволяет описать тот же набор триплетов с помощью атрибутов, а не элементов. Например, описанный выше набор триплетов может быть задан как <rdf:RDF xmlns:rdf="http xmlns:journal=" <rdf:Description rdf:about="www. journal:author= journal:title = </rdf:Description> </rdf:RDF> ://www.w3.org/1999/02/22- http://www jrn. "J. jrn#"> org/vl/pl.html" Smith" "Something •> -rdf- -ayntax- -пз#" 2.8.3. Дополнительные структуры RDF/XML. В RDF предусмотрен ряд способов группировки данных. Пустой узел — это узел графа RDF, который не содержит данных, но используется как родительский узел для группировки данных. Последнюю можно пояснить на следующем примере. Дата выхода тома журнала состоит из номера месяца и номера года. Допустим, что нам для обработки данных нужно иметь свойство «дата» и подсвойства «месяц» и «год». Это реализуется следующим образом. Вводится пустой узел, определяемый URI genid:VOLUMEDATE (этот URI произволен), и записываются тройки Subject WWW.]ГП Predicate Object org/vl.html http genid:VOLUMEDATE genid:VOLUMEDATE http http //www.jrn#date genid:VOLUMEDATE //www //www jrn#datemonth jrn#dateyear ' "03" 2007"
В нотации RDF/XML пустой узел описывается элементом rdf: Description без атрибута about. Анализируемый нами пример записывается следующим образом: Файл 2 8 4.xml <?xml version="1.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22- xmlns:j ournal="http://www.j rn#"> <rdf:Description> <journal:datemonth>03</journal:datemonth> <journal:dateyear>2008</journal:dateyear> </rdf:Description> </rdf:RDF> rdf-syntax-ns#" Контейнеры. Элемент rdf: Bag используется для того, чтобы задать неупорядоченный список элементов, и может содержать повторяющиеся значения. В следующем примере описаны ключевые слова статьи. Файл 2 8 5.xml <?xml version="1.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:journal="http://www.jrn#"> <rdf:Description rdf:about="www.jrn.org/vl/pl.html"> <j ournal:paperkeywords> <rdf:Bag> <rdf:li>function</rdf:li> <rdf:li>set</rdf: li> <rdf:li>map</rdf:li> </rdf:Bag> </j ournal:paperkeywords> </rdf:Description> </rdf:RDF> Укажем набор триплетов, соответствующий этому набору RDF-данных, который сгенерирован программой-валидатором (http://www.w3.org/RDF/Validator/). Будем записывать триплеты в форме (Subject, Predicate, Object) и нумеровать их. 1. (genichA31721, http://www.w3.org/1999/02/22-rdf- syntax-nsttype, http://www.w3.Org/1999/02/22-rdf-syntax-ns#Bag) 2. (http://www.jrn.org/vl/pl.html, http://www.jrn#paperkeywords, genid:A31721) 3. (genid:A31721, http://www.w3.org/1999/02/22-rdf- syntax-ns#_l, "function") 4. (genid:A31721, http://www.w3.org/1999/02/22-rdf- syntax-ns#_2,"set") 5. (genid:A31721, http://www.w3.org/1999/02/22-rdf- syntax-ns#_3, "map")
Для представления элемента Bag в виде триплетов используется ресурс, определяемый URI genid:A31721 (имя автоматически генерируется программой). Он является родительским узлом для узлов, входящих в список. Элемент rdf :Seq описывает упорядоченный список свойств и может содержать повторяющиеся значения. Например, Файл 2 8 6.xml <?xml version="l.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-3yntax-n3#" xmlns:journal="http://www.jrn#"> <rdf:Description rdf:about="www.jrn.org"> <j ournal:authors> <rdf:Seq> <rdf:li>J. Smith</rdf:li> <rdf:li>M. Johnson</rdf:li> <rdf:li>S. Bush</rdf:li> </rdf:Seq> </journal:authors> </rdf:Description> </rdf:RDF> Укажем набор триплетов, соответствующий этому набору RDF-данных. Будем записывать триплеты в форме (Subject, Predicate, Object) и нумеровать их. 1. (genid:A31880, http://www.w3.org/1999/02/22-rdf- syntax-ns#type, http://www.w3.Org/1999/02/22-rdf-3yntax-na#Seq) 2. (http://www.jrn.org, http://www.jrn#authors, genid:A31880) 3. (genid:A31880, http://www.w3.org/1999/02/22-rdf- syntax-ns#_l, "J. Smith") 4. (genid:A31880, http://www.w3.org/1999/02/22-rdf- syntax-ns#_2 ,"M. Johnson") 5. (genid:A31880, http://www.w3.org/1999/02/22-rdf- syntax-ns#_3, "S. Bush") Элемент rdf: Alt предназначен для представления списка, из которого пользователь может выбрать только одно значение: Файл 2 8 7.xml <?xml version="1.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-3yntax-ns#" xmlns:journal="http://www.jrn#"> <rdf:Description rdf:about="www.jrn.org"> <j ournal:papers> <rdf:Alt>
<rdf:li>www.jrn.org/vl</rdf: li> <rdf:li>www.jrn.org/v2</rdf:li> <rdf:li>www.jrn.org/v3</rdf:li> </rdf:Alt> </journal:papers> </rdf:Description> </rdf:RDF> Представление в виде триплетов: 1. (genid:A31924, http://www.w3.org/1999/02/22-rdf- syntax-ns#type, http://www.w3.org/1999/02/22-rdf-syntax-ns#Alt) 2. (http://www.jrn.org, http://www.jrn#papers,genid:A31924) 3. (genid:A31924, http://www.w3.org/1999/02/22-rdf- syntax-ns#_l, "www.jrn.org/vl") 4. (genid:A31924, http://www.w3.org/1999/02/22-rdf- syntax-ns#_2, "www.jrn.org/v2") 5. (genid:A31924, http://www.w3.org/1999/02/22-rdf- syntax-ns#_3, "www.jrn.org/v3") Наборы. В элементах, задающих контейнеры, не предполагается, что контейнер описывает группу, содержащую только данные элементы. Набор отличается от контейнера тем, что он описывает группу, содержащую только указанные элементы. В следующем примере описан журнал, в котором ровно три номера. Файл 2 8 8.xml <?xml version="1.0"?> <rdf:RDF xmlns:rdf="http //www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:journal="http <rdf:Description rdf:about="www. - //www. rn.org"> jrn#"> <journal:volumes rdf:parseType="Collection"> <rdf:Description <rdf:Description <rdf:Description rdf rdf rdf </journal:volumes> </rdf:Description> </rdf:RDF> about= about= about= 'http 'http 'http //www //www //www jrn Drn irn org/vl org/v2 org/v3 7> 7> 7> Представление в виде триплетов: 1. (http://www.jrn.org, http://www.jrn#volumes, genid:A32230) 2. (genid:A32230, http://www.w3.org/1999/02/22-rdf- ayntax-ns#first, http://www.jrn.org/vl), 3. (genid:A32230, http://www.w3.org/1999/02/22-rdf- ayntax-ns#rest, genid:A32231)
4. (genid:A32231, http://www.w3.org/1999/02/22-rdf- syntax-ns#first, http://www.jrn.org/v2) 5. (genid:A32231, http://www.w3.org/1999/02/22-rdf- syntax-ns#rest, genid:A32232) 6. (genid:A32232, http://www.w3.org/1999/02/22-rdf- syntax-ns#first, http://www.jrn.org/v3) 7. (genid:A32232, http://www.w3.org/1999/02/22-rdf- syntax-ns#rest, http://www.w3.Org/1999/02/22-rdf-syntax-ns#nil) 2.8.4. Dublin Core в терминах RDF. RDF можно рассматривать и как систему метаданных. В 1995 г. на Metadata Workshop в городе Дублин (штат Огайо, США) был сформирован набор метаданных — Dublin Core Metadata Initiative (DCMI) [24], описывающий ряд предопределенных свойств документов. Приведем этот набор в виде следующей таблицы (http://dublincore.org/documents/2006/12/18/dces/; перевод Алексея Бешенова, http://beshenov.ru) URI: Метка: Определение: Комментарий: URI: Метка: Определение: Комментарий: URI: Метка: Элементы Элемент: contributor http://purl.Org/dc/elements/l.l/contributor Участник Сущность, участвующая в создании содержимого ресурса Человек, организация или сервис; обычно совпадает с именем человека, названием организации или сервиса Элемент: coverage http://purl.Org/dc/elements/l.l/coverage Охват Пространство или границы, с которыми связано содержимое ресурса Как правило, географическое положение (название места или координаты), временной период (название периода, дата, набор дат) или подведомственная область (такая, как административная область). Рекомендуется выбирать значение из определенного словаря (например, «Thesaurus of Geographic Names») и использовать, где это возможно, именованные места и периоды времени вместо числовых идентификаторов (координат или промежутков дат) Элемент: creator http://purl.0rg/dc/elements/l.l/creator Автор
Определение: Сущность, ответственная за производство содержимого ресурса Комментарий: Человек, организация или сервис; обычно совпадает с именем человека, названием организации или сервиса Элемент: date URI: http://purl.Org/dc/elements/l. 1/date Метка: Дата Определение: Дата события в жизненном цикле ресурса Комментарий: Может использоваться для выражения временной информации на любом уровне точности. Рекомендуется представлять дату в соответствии с ISO 8601 Элемент: description URI: http://purl.org/dc/elements/Ll/description Метка: Описание Определение: Описание содержимого ресурса Комментарий: Резюме, оглавление, ссылка на графическое представление контента, произвольное описание и другая подобная информация Элемент: format URI: http://purl.0rg/dc/elements/l.l/format Метка: Формат Определение: Физическое или цифровое представление ресурса, измерение Комментарий: Измерение может быть, например, размером или продолжительностью. Рекомендуется выбирать значение из определенного словаря, например, списка типов данных интернета MIME Элемент: identifier URI: http://purl.0rg/dc/elements/l. 1/identifier Метка: Идентификатор Определение: Конкретная ссылка на ресурс в данном контексте Комментарий: Рекомендуется определять ресурс при помощи строки или числа, удовлетворяющего формальной системе идентификации Элемент: language URI: http://purl.org/dc/elements/Ll/language Метка: Язык Определение: Национальный язык содержимого Комментарий: Рекомендуется выбирать значение из определенного словаря, такого, как RFC 3066
URI: Метка: Определение: Комментарий: URI: Метка: Определение: Комментарий: URI: Метка: Определение: Комментарий: URI: Метка: Определение: Комментарий: URI: Метка: Определение: Комментарий: URI: Элемент: publisher http://purl.0rg/dc/elements/l. l/publisher Издатель Сущность, делающая ресурс доступным Человек, организация или сервис; обычно совпадает с именем человека, названием организации или сервиса Элемент: relation http://purl.0rg/dc/elements/l. 1/relation Связь Ссылка на связанный ресурс Рекомендуется определять связь при помощи строки или числа, удовлетворяющего формальной системе идентификации Элемент: rights http://purl.org/dc/elements/Ll/rights Правовая информация Правовая информация, связанная с ресурсом Правовая информация содержит правовые соглашения, касающиеся ресурса, включая информацию о правах на интеллектуальную собственность Элемент: source http://purl.0rg/dc/elements/l. 1/source Источник Ссылка на ресурс, на основе которого составлен данный ресурс Данный ресурс может быть составленным из источника частично или полностью. Рекомендуется определять источник при помощи строки или числа, удовлетворяющего формальной системе идентификации Элемент: subject http://purl.0rg/dc/elements/l.l/subject Тема Тема содержимого ресурса Как правило, выражается ключевыми словами, фразами либо кодами классификации. Рекомендуется выбирать значение из соответствующего тезауруса. Пространственная или временная принадлежность ресурса должна описываться элементом coverage Элемент: title http://purl.0rg/dc/elements/l.l/title
Метка: Заголовок Определение: Название ресурса Комментарий: Как правило, совпадает с названием, под которым формально известен ресурс Элемент: type URI: http://purl.Org/dc/elements/l.l/type Метка: Тип Определение: Вид или жанр содержимого ресурса Комментарий: Рекомендуется выбирать значение из определенного словаря, такого, как DCMI Type Vocabulary. Физическое или цифровое представление ресурса определяется элементом format Метаданные Dublin Core могут быть заданы с помощью RDF. В качестве примера приведем такой набор метаданных для электронного математического журнала Lobachevskii Journal of Mathematics (http://ljm.ksu.ru). Файл 2 8 9 .xml <?xml version="l,0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc= "http://purl.org/dc/elements/1.l/"> <rdf:Description rdf:about="http://www.jrn.org"> <dc:title>Lobachevskii Journal of Mathematics</dc:title> <dc:description> Electronic Mathematical Journal </dc:description> <dc:publisher>Kazan State University</dc:publisher> <dc:date>1996-08-02</dc:date> <dc:type>Text</dc:type> <dc:format>text/html</dc:format> <dc:language>en</dc:language> </rdf:Description </rdf:RDF> Так как RDF-граф может быть описан с помощью XML, набор метаданных Dublin Core в формате RTF может быть включен в XML-документ. Приведем пример: Файл 2 8 10.xml <?xml version="l.0" encoding="windows-1251"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> </head> <body> <!— RDF набор метаданных: —>
<rdf:RDF xmlns:rdf="http:/ /wvrw.w3.org/19 99/02 /22-rdf-syntax-ns#" xmlns:dc="http://purl.org/metadata/dublin_core#"> <rdf:Description rdf:about="http://1jm.ksu.ru/vol8/latin.htm"> <dc:Publisher> Lobachevskii Journal of Mathematics </dc:Publisher> <dc:Title> Splitting iterative methods and parallel solution of variational inequalities </dc:Title> <dc:Author> <rdf:Seq ID="AutorsAlphabeticalBySurname" rdf:_l="E.Laitinen" rdf:_2="A.V. Lapin" rdf:_3="J.Pieska"/> </dc:Author> <dc:Subject>mathematics, applied mathematics, scientific computing </dc:Subject> </rdf:Description> </rdf:RDF> <p> Splitting iterative methods for the sum of maximal monotone and <!-- MathML вставка --> <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>a</mi> <msup> <mi>x</mi> <mn>2</mn> </msup> <mo>+</mo> <mi>b</mi> <mi>x</mi> <mo>+</mo> <mi>c</mi> <mo>=</mo> <mn>0</mn> </math> </p> </body> </html> 2.9. Практический пример применения XML-технологий. Описание электронной библиотеки Конечно, вы профессионально занимаетесь математикой (а зачем иначе вам читать эту книгу) и тогда не только сами пишете статьи, но и иногда читаете чужие. Наверняка на вашем персональном компьютере есть коллекция файлов со статьями и книгами по математике, и она уже настолько большая, что в ней трудно что-либо быстро найти.
Мы покажем, как с помощью XML-технологий сделать это просто и эффективно. Впрочем, как «нет царского пути в геометрию» (а кто это сказал?), так и составление XML-описания потребует от вас определенных затрат времени и сил. Плюс в том, что сделать это потребуется один раз, а использовать такое описание, как будет ясно, можно много раз и по-разному. Вначале подумаем, какая информация о статье или книге нам нужна. Понятно, что нужны, по-крайней мере, авторы, название и выходные данные. Неплохо для более эффективного поиска дополнить эту информацию ключевыми словами. Также нужно имя файла со статьей. Конечно, может понадобиться еще информация — реферат, классификаторы, свои заметки по поводу этой статьи, наконец. Но давайте остановимся на минимуме сведений — из дальнейшего будет ясно, как расширять информационный набор по мере необходимости. Итак, наш первый шаг — создание структуры XML-документа с описанием коллекции. Например, она может быть такой: <?xml version='1.0' encoding»'UTF-8'?> <biblist> <!— biblist - это корневой элемент нашего XML-документа —> <bibitem type="article"> <!— Содержимое элемента bibitem - описание одной статьи или хниги, атрибут type элемента bibitem - это книга (book), статья (article), препринт (preprint) или что-нибудь еще --> <authors> <!— Список авторов —> </authors> <title> <!— Заглавие публикации —> </title> <journal> <!-- Выходные данные журнальной статьи —> <journaltitle></journaltitle> <volume></volume> <pages> <firstpagex/firstpage> <lastpage></lastpage> </pages> </journal> <!— для книги выходные данные содержатся в элементе book —> <book> <publisher></publisher> <numberofpages></numberofpages> </book> <!-- год выпуска есть и у книги, и у статьи, поэтому этот элемент поставим здесь —> <уеагх/уеаг> <!— Ключевые слова —> <keywords></keywords> <!— URI файла с публикацией -->
<urix/uri> <!— Метка: может использоваться, например, для BibTeX- документа —> <labelx/label> </bibitem> </biblist> Это только одна из возможных структур и, конечно, не самая лучшая. Благодаря гибкости XML вы можете выбрать любую структуру, которая наиболее полно удовлетворит ваши потребности. Вообще, структура XML-документа — это самое главное, и ее надо хорошо продумать, затраты времени на создание хорошей структуры многократно окупятся при дальнейшей работе с ней. Однако двинемся дальше. Сначала создадим файл в соответствии с этой структурой. Файл 2 9 l.xml <?xml version='1.0' encodingsUTF-8'?> <biblist> <bibitem type="article"> <authors>Dulce M. Almeida</authors> <title> Sub-Riemannian symmetric spaces of Engel type </title> <journal> <journaltitle>Mat. Contemp.</journaltitle> <volume>17</volume> <pages> <firstpage>45</firstpage> <lastpage>58</lastpage> </pages> </journal> <year>1999</year> <keywords> sub-riemannian, symmetric space </keywords> <uri>file:17_3.pdf</uri> <label>ALM</label> </bibitem> <bibitem type="article"> <authors>Robert S. Strichartz</authors> <title>Sub-riemannian geometry</title> <journal> <j ournaltitle> J. Differential Geometry </journaltitle> <volume>24</volume> <pages> <firstpage>221</firstpage> <lastpage>263</lastpage> </pages> </journal> <year>1976</year>
<keywords> sub-riemannian</keywords> <uri>file:24-2-221.pdf</uri> <label>STR</label> </bibitem> <bibitem type="book"> <authors> Б. А. Дубровин, С. П. Новиков, А. Т. Фоменко </authors> <title>CoBpeueHHaH reoMeTpHH</title> <book> <риЬИзпег>Эдиториал yPCC</publisher> <numberofpages>278</numberofpages> </book> <year>1998</year> <keywords>reoMeTpHH</keywords> <uri>file:dnf.djvu</uri> <label>DNF</label> </bibitem> </biblist> Этот XML-документ содержит полную информацию, но, конечно, в таком виде ее трудно использовать. На помощь придет XSLT. Варианты использования XML-документа 2_9_1.xml. Вариант 1. Самый простой, но достаточно эффективный способ использования информации, содержащейся в 2_9_1.xml, — создать HTML-документ с оглавлением нашей библиотеки. Это мы сделаем с помощью следующей простой XSL-таблицы: Файл 2 9 2.xsl <xsl:stylesheet version="l.О" xmlns:xsl='http://www.w3.org/1999/XSL/Transform' > <xsl:template match="biblist"> <!-- нам нужен HTML-документ --> <html> <body> <xsl:for-each select="bibitem"> <!— авторы выделены курсивом —> <i> <xsl:value-of select="authors"/> </i> <xsl:text> </xsl:text> <!— с названий идут ссылки на соответствующий файл --> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="uri"/> </xsl:attribute> <xsl:value-of select="title"/> </xsl:element> <brx/br> </xsl:for-each> </body>
</html> </xsl:template> </xsl:stylesheet> Теперь в файл 2_9_1.xml добавим ссылку на стилевую таблицу 2_9_2.xsl и получим новый XML-документ Файл 2_9_3.xml <?xml version='1.О' encoding='UTF-8'?> <!— добавлена ссылка на стилевую таблицу --> <?xml-stylesheet type='text/xsl' href='2_9_1.xsl'?> <biblist> <bibitem type="article"> <authors>Dulce M. Almeida</authors> <title> Sub-Riemannian symmetric spaces of Engel type </title> <journal> <journaltitle>Mat. Contemp.</journaltitle> <volume>17</volume> <pages> <firstpage>45</firstpage> <lastpage>58</lastpage> </pages> </journal> <year>1999</year> <keywords> sub-riemannian, symmetric space </keywords> <uri>file:17_3.pdf</uri> <label>ALM</label> </bibitem> <bibitem type="article"> <authors>Robert S. Strichartz</authors> <title>Sub-riemannian geometry</title> <journal> <journaltitle> J. Differential Geometry </journaltitle> <volume>24</volume> <pages> <firstpage>221</firstpage> <lastpage>263</lastpage> </pages> </journal> <year>197 6</year> <keywords> sub-riemannian</keywords> <uri>file=24-2-221.pdf</uri> <label>STR</label> </bibitem> <bibitem type="book"> <authors> Б. А. Дубровин, С. П. Новиков, А. Т. Фоменко </authora> <title>CoBpeueHHaH reoueTpHH</title>
<book> <риЫ1зпег>Эдиториал yPCC</publisher> <numberofpages>278</numberofpages> </book> <year>1998</year> <keywords>reoMeTpHH</keywords> <uri>file:dnf.djvu</uri> <label>DNF</label> </bibitem> </biblist> Откроем 2_9_3.xml в браузере, а для чтения статьи или книги кликнем на их названии. Также легко осуществить поиск по названию или авторам — это можно сделать средствами браузера, как мы обычно ищем что-либо на веб-странице. Естественно, что стоит добавить заглавие страницы, форматирование и т.п., чтобы сделать оглавление удобным и легко читаемым. Уверены, что это вам по силам, особенно после того, как вы освоили раздел 2.7. Для примера приведем еще одну стилевую таблицу и посмотрим, как результат выглядит в браузере. Файл 2 9 4.xsl <xsl:stylesheet version="l.О" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="biblist"> <html> <body> <Ь2>Наша библиотека</Ь2> <ul> <xsl:for-each select="bibitem"> <li> <i> <xsl:value-of select="authors"/> <xsl:text>; </xsl:text> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="uri"/> </xsl:attribute> <xsl:value-of select="title"/> </xsl:element> </li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet> В браузере это выглядит так, как показано на рис. 2.8. Видите: заглавия публикаций — это ссылки; если «кликнуть» на них, то будут загружаться соответствующие документы.
Файл Правка Вид Журнал Закладки Инструменты Справка ♦ * v 0 9 й №'■■»■ .мг,.-> м-■М'-к-.иу-,,■■■/■.,,■■,. ■;..,; .. у| (ьТ~^. ,д ■■ , .,ci,-.^| BNewsv BLosAndesv BKazanv QMathv CjLinuxv QToolev BTutoriatsv |g)|jm_admin ggSageJiome rf v J screen snapshot lin;v j | 4»Поиск v ЙЬВверх ^ ^Подсветка Qscreen Qsnapshot Qlinux @ file/flhome ..ok/2_9_3.xml X jjjscreensnapshotlinux-... X [®Unux.com^Howlocho... X i + Наша библиотека • Dulce M. Almeida; Sub-Riemaoniaa symmetric spaces of Engel ivpe • Roberts. Sirlchartz: Sab-ricmannian geometry • Б. А. Дубровин. С. П. Новиков, А. Т. Фоиеико; Современная геометрия попеТмо! @Э й. 1 Tonlghl:16'C (* Г Tmi: 2S'C g£ ! Рис. 2.8. Оглавление библиотеки, представленное в браузере Вариант 2. Сделаем из 2_9_1.xml файл в формате BibTeX (как математик, вы наверняка используете Т£Х для набора ваших статей?). Сделаем это с помощью стилевой таблицы (думаем, вы в состоянии уже самостоятельно разобраться в ней). Файл 2 9 5.xsl <xsl:stylesheet version="l.О" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="biblist"> <xsl:for-each select="bibitem"> <xsl:text>@</xsl:text> <xsl:value-of select="@type"/> <xsl: text> {</xsl: text> <xsl:value-of select="label"/> <xsl:text>, author= " </xsl:text> <xsl:value-of select="authors"/> <xsl:text>", title= " </xsl:text> <xsl:value-of select="title"/> <xsl:text>", </xsl:text> <xsl:if test="@type = 'book'"> <xsl:text> publisher= "</xsl:text> <xsl:value-of select="book/publisher"/> <xsl:text>", year= " </xsl:text> <xsl:value-of select="year"/> <xsl:text>", pages=" </xsl:text> <xsl:value-of select="book/numberofpages"/> <xsl:text>" } </xsl:text>
</xsl:if> <xsl:if test="@type = 'article'"> <xsl:text> journal = "</xsl:text> <xsl:value-of select="journal/journaltitle"/> <xsl:text>", year= " </xsl:text> <xsl:value-of select="year"/> <xsl:text>", volume ="</xsl:text> <xsl:value-of select="journal/volume"/> <xsl:text>", pages=" </xsl:text> <xsl:value-of select="journal/pages/firstpage"/> <xsl:text>—</xsl:text> <xsl:value-of select="journal/pages/lastpage"/> <xsl:text>" } </xsl:text> </xsl:if> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> Если у вас есть какой-либо XSLT-процессор (например, xsltproc), то из 2_9_1.xml с помощью 2_9_5.xsl получится следующий BibTeX-файл: Файл 2 9 6.bib @article{ALM, author= "Dulce M. Almeida", title= "Sub-Riemannian symmetric spaces of Engel type", journal = "Mat. Contemp.", year= "1999", volume ="17", pages="45--58" @article{STR, author= "Robert S. Strichartz", title= "Sub-riemannian geometry", journal = "J. Differential Geometry", year= "1976", volume ="24", pages="221—263" @book{DNF, author= "Б. А. Дубровин, С. П. Новиков, А. Т. Фоменко", title= "Современная геометрия", publisher= "Эдиториал УРСС",
year= "1998", pages="278" } Если XSLT-процессора на вашем компьютере нет и устанавливать его не хочется, то можно сделать обходной маневр — заставить работать XSLT-процессор браузера (все равно он там есть, что же ему простаивать!). Для этого сделаем в 2_9_1.xml ссылку на стилевую таблицу 2_9_5.xsl или в 2_9_3.xml заменим <?xml-stylesheet type='text/xsl' href='2_9_1.xsl'?> на <?xml-stylesheet type='text/xsl' href='2_9_5.xsl'?> (сохраним за полученным файлом старое название 2_9_3.xml). Снова откроем его в браузере Firefox и увидим картину, представленную на рис. 2.9. Файл Правка Вид Журнал Закладки Инструменты Справка * v © *- й IB) ;i' " ■'■-■■'' -■^■■■■•.:-г- :'. ■■.*■■>,- .■•■■'•..; -■■■-..- ... Н |Б~ instead щ| Щ v ONewsv ("gLosAndesv DKazan^ BMatnv Di-'nuxv ("gToolsv ("gTutonalsv |©)ljm_admin ^Sage_home G1-v Ixslt processor onlin . vj j ЧПоиск v йй Вверх v ^Подсветка Qxslt Qprocessor Qonline Si file:/»rrame/p. .book/2_9_4.xml [ * " @articlc{, author= "Dulce M. Almeida". titlc=" Sub-Ricmannian symmetric spaces of Engel type "Journal =" Mat. Contemp.". year= '".volume =" 17 ",pages="45-58" } @article{, author= "Robert S. Strichartz", title="Snb-riemanuiaD geometry",journal = "J. Differential Geometry", year="", volume ="24". pages="221-263" } @book{. autlior= "Б. А. Дубровин, С. П. Новиков, А. Т. Фоменко", title= "Современная геометрия", publisher^ "Эдиториал УРСС", уеаг= "1998", pages="278" } Рис. 2.9. Результат загрузки видоизмененного файла 2_9_3.xml в браузере Firefox Вид не очень красивый! Но мы не собираемся это читать или кому-то показывать. Сохраним теперь этот файл как «Веб-страница, полностью» с именем 2_9_7.ЫЬ (не забудьте поменять имя файла — скоро поймете, почему). Откроем его: Файл 2 9 7.bib <?xml version="l.О" encoding="OTF-8"?> <transformiix:result xmlns:transformiix="http://www.mozilla.org/TransforMiix"> @article{, author= "Dulce M. Almeida", title= " Sub-Riemannian symmetric spaces of Engel type ", journal = " Mat. Contemp. ", year= "1999", volume =" 17 ", pages="45—58" }
6article{, author= "Robert S. Strichartz", title= "Sub-riemannian geometry", journal = "J. Differential Geometry", year= "1976", volume ="24", pages="221--263" } @book{, author= "Б. А. Дубровин, С. П. Новиков, А. Т. Фоменко", title= "Современная геометрия", publisher= "Эдиториал УРСС", уеаг= "1998", pages="278" } </transformiix:result> Конечно, он ничего общего не имеет с видоизмененным файлом 2_9_3.xml (поэтому и надо было поменять имя при сохранении), зато содержит нужный нам файл в формате BibTeX. Надо лишь убрать несколько лишних строчек, и все будет в порядке. Вариант 3. Два предыдущих примера были, так сказать, статическими, т.е. не предусматривали взаимодействия с пользователем. Теперь приведем пример динамического использования XML-документа. Сделаем HTML-страницу с формой для поиска документа по ключевым словам (мы ведь не зря предусмотрительно включили ключевые слова в наш XML-документ). Для этого используем Javascript в HTML-документе. Здесь мы не имеем возможности объяснять, как программировать на языке Javascript (интересующегося читателя отошлем к [25]), поэтому ограничимся краткими пояснениями в тексте скрипта. Важно отметить, что приведенный ниже документ адаптирован к Firefox и не будет работать в InternetExplorer (в IE задача загрузки XML-документа решается другими средствами). Файл 2 9 8.html <HTML> <HEAD> <SCRIPT TYPE="text/javascript"> /* Функция loadxml загружает 2_9_l.xml и создает из него объект XML DOM */ loadxml(){ if (document.implementation && document.implementation.createDocument) <
xmlDoc = document.implementation.createDocument("","",null); xmlDoc.load("2_9_1.xml"); xmlDoc.onload = makeArrays(); } } /* Функция makeArrays создает массивы авторов, названий, ключевых слов и uri публикаций /* function makeArrays(){ authorArray = xmlDoc.getElementsByTagName("authors"); uriArray = xmlDoc.getElementsByTagName("uri"); titleArray = xmlDoc.getElementsByTagName("title"); keywordsArray = xmlDoc.getElementsByTagName("key-words"); } /* Функция doSearch реализует поиск ключевых слов, введенных в форму, и выводит результаты поиска /* function doSearch(form){ var searchString = document.searchform.searchstring.value; var resultString=""; for (var counter=0; counter < keywordsArray.length; counter++) { stringl = keywordsArray[counter].childNodes[0].nodeValue; var re = RegExp(searchString,"i"); var OK = re.exec(stringl); if (OK) ( resultString = resultString +"<LIXA HREF=\"" + uriArray[counter].childNodes[0].nodeValue + "\"> <i>" + authorArray[counter].childNodes[0].nodeValue + "</i> " titleArray[counter].childNodes[0].nodeValue + "</A><BR/> <b>Keywords:</b> " + keywordsArray[counter].childNodes[0].nodeValue + "</LI>" ) ) if (resultString=="") ( resultString = "Sorry, nothing found";} else {resultString = "<H3>Search Results</H3><UL>"+ resultString+"</UL>"); document.getElementById("show").innerHTML = resultString; } </SCRIPT> </HEAD> <B0DY onload="javascript:loadxmK)"> <!— прн вызове HTML-документа загружается XML-документ 2_9_l.xml —> <h2>Search form</h2> <P> Type here the keywords you need and press button </p>
<!-- форма для поиска ключевых слов; результат обрабатывается функцией doSearch() —> <FORM ACTION="" NAME="searchform" METHOD="GET"> <INPUT TYPE="text" NAME="searchstring" SIZE="50"> <INPUT TYPE="button" NAME="button" VALUE="Search" onClick="doSearch(this.form)"> </FORM> <P ID="show"> </P> </BODY> </HTML> Мы уверены, что наш читатель понимает, что приведенный скрипт легко модифицировать, чтобы организовать поиск по авторам, названиям и вообще по содержимому любого элемента в исходном XML-документе. Приведем пару скриншотов нашей страницы. При открытии она имеет вид, представленный на рис. 2.10. После введения искомых ключевых слов и нажатия на кнопку Search эта страница примет вид, представленный на рис. 2.11. Файл Правка Вид Журнал Закладки Инструменты Справка * » ~ в V- & IB '■■■ "-■■■ '■ ■■■■.■.•-■■■•■■■■*\~--:у,>-..----1 |.г.-., ... ~| |fe^..,. .-■■<-.. .i-.^l Щ ~ BNewsv E^LosAndes^ ЙКагагт" EJMathv- QLinuxv CJTooIsv QTutorialsv ;«*iljm_admin [j^jSage_home G1'v [javascript load xml jv: j ЧПоиск v гЭ Вверх ^ ^Подсветка Qjavascript Qtoad Qxml Dfirefox :® fife://yhome...ng=geometry X |®fite:///home...ok/2_9_1.xmr X [jgXMLParser . X j + v Search form Type here the keywords you need and press button ) j i Search Рис. 2.Ю. Скриншот страницы с файлом 2_9_8.html Файл Правка Вид Журнал Закладки Инструменты Справка * » - 0 ■*> ft I3 :•" ■■■'■-■-■■ ■■■■■■ ■■■^■-^"■'•■' ::-■■■-... Ч Ift^i.v-r.-i-^ 'ТЩ ф „ QNews^ QLosAndesv ^JKazanv [^Mathv ^Linux" SToolsv QTulorialsv |e)ljm_admin jJUSageJiome (f v [javasenpt load xml ' v] j ЛПоиск v f8lВверх v ^Подсветка Qjavascripl Qload Qxml Qfirefox I ,i)file:///home ng=geometry X |[^fife:///home...ok/2l.9_1.xm^X jgXMLParser ''_*']* v Search form Type here the keywords you need and press button jsub j [ Search] Search Results • DiilceM. Almeida Sub-Riemannian symmetric spaces of Engel type Keywords: sub-riemannian, symmetric space • Roberts. S/iichartzSub-riemannian geometry Keywords: snb-riemaiinian Рис. 2.П. XML-схема нашей библиотеки
Мы делаем оглавление нашей библиотеки для использования на своем персональном компьютере и даже не думаем о включении его в какую-либо систему. Зачем тогда нам нужна XML-схема? Наш ответ — лучше такую схему сделать, ведь наверняка вы будете дополнять ваш XML-документ, специально не задумываясь над тем, что делаете (возможно, в этот момент вы будете думать о новой теореме Или симпатичной сотруднице, но уж точно ваши мысли будут далеки от этого скучного текста), поэтому вы будете делать ошибки*. А когда ошибки накопятся, вся система станет неработоспособной. Поэтому сделайте схему, и впоследствии сэкономите время. В любой момент вы будете знать, что ваш XML-документ хотя бы формально правильный. Перечитайте еще раз раздел 2.6 и вспомните, как составляется XML-схема, и потом посмотрите следующий пример. Файл 2 9 9.xsd <xsd:schema xmlns:xsd="http://www.w3.org/200l/XMLSchema"> <xsd:element name="biblist"> <xsd:complexType> <xsd:sequence> <xsd:element ref="bibitem" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="bibitem"> <xsd:complexType> <xsd:sequence> <xsd:element name="authors" minOccurs="0" type=cxsd:string"/> <!-- авторов может не быть, поэтому ставим minOccurs --> <xsd:element name="title" type="xsd:string"/> <!— а название должно быть обязательно и только одно! --> <xsd:choice> <!—публикация, или статья в журнале, или книга, поэтому используем элемент choice! --> <xsd:element ref="journal"/> <xsd:element ref="book"/> </xsd:choice> <xsd:element name="year" type="xsd:gYear"/> <xsd:element name="keywords" type="xsd:string"/> <xsd:element name="uri" type="xsd:anyURI"/> <xsd:element name="label" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="type" type="itemtype" use="required"/> </xsd:complexType> </xsd:element> <xsd:element name="journal"> <xsd:complexType> <xsd:sequence> <xsd:element name="journaltitle" type="xsd:string"/> <xsd:element name="volume" type="Ksd:int"/> <xsd:element ref="pages"/> </xsd:sequence>
</xsd:complexType> </xsd:element> <xsd:element name="book"> <xsd:complexType> <xsd:sequence> <xsd:element name="publisher" type="xsd:string"/> <xsd:element name="numberofpages" type="xsd:int"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="pages"> <xsd:complexType> <xsd:sequence> <xsd:element name="firstpage" type="xsd:int"/> <xsd:element name="lastpage" type="xsd:int"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:simpleType name="itemtype"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="article"/> <xsd:enumeration value="book"/> </xsd:restriction> </xsd:simpleType> <!— если в нашем XML-документе есть другие типы публикаций, например, preprint или collective works, то их надо сюда добавить --> </xsd:schema> Теперь, добавив новую информацию в документ 2_9_1.xml, всегда можно провести верификацию этого файла на соответствие схеме 2_9_9.xsd и исправить ошибки (забыли как? Вернитесь к разделу 2.6!). В чем же состоят сильные стороны этого решения задачи описания файлов с публикациями на вашем компьютере? Прежде всего, стоит сказать, что эта задача может быть решена многими способами, начиная от «я ничего делать не буду, я и так знаю, где что у меня лежит» и кончая использованием мощных баз данных и специализированных программ (может быть, кто-нибудь еще помнит программу bookseer под Windows). Однако предлагаемая нами методика имеет следующие плюсы: 1. Минимум программ — используются только текстовый редактор и браузер: инструменты, которые наверняка есть на любом компьютере. Лучше, конечно, иметь еще набор утилит для работы с XML и даже XML-редактор, но это не обязательно. 2. Независимость от операционной системы — браузер Firefox, который мы рекомендуем, работает в Linux, MacOS, Windows. Переносимость — вы легко перенесете информацию с домашнего компьютера на ноутбук и на компьютер в ваш офис в университете (а у вас есть офис в университете?). 3. Масштабируемость — если вы с коллегами захотите объединить ваши библиотеки или вообще сделать библиотеку в департаменте,
то легко сможете это сделать, используя указанную методику. Надо лишь договориться с коллегами об использовании одной и той же XML-схемы (конечно, это самое сложное). Если вам удастся договориться, то объединить XML-документы — дело пяти минут! 4. Возможность использования на локальном компьютере, на отдельном носителе (например, CD-ROM), в локальной сети или в глобальной сети. Для применения этой технологии физическое расположение файлов абсолютно несущественно. 5. Гибкость — вы сами определяете структуру данных, что вам нужно при описании публикаций, а что нет (это противоречит пункту 3, но что поделать — мир противоречив). 6. Возможность самостоятельной разработки и адаптации к индивидуальным требованиям, создание собственных программных средств. И, наконец, 7. Мы с вами создали небольшой, но свой язык разметки, специализированный для описания электронной библиотеки научных публикаций] Подробно о разработке собственных языков разметки см. главу 8. 2.10. HTML и XHTML Как мы уже говорили, HTML — это язык гипертекстовой разметки, разработанный Т. Бернерсом-Ли в начале 1990-х гг., который в основном используется для передачи информации через браузер. В настоящее время подавляющее большинство документов в сети написано именно на HTML. Последняя версия HTML (HTML 4.01) была разработана в 1999 г. (http://www.w3.org/TR/html4/), а уже в 2000 г. консорциум W3C предложил «более ясную и строгую» версию этого языка — XHTML (Extensible HyperText Markup Language). Приведем пример XHTML-документа. Файл 2_10_1.xhtml <?xml version="l.0" encoding="utf-8"?> <!— первая строка файла говорит о том, что XHTML-документ является XML-документом —> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://vww.w3.org/TR/xhtmlll/DTD/xhtrnlll.dtd"> <!-- Документ обязан иметь корневой элемент html с атрибутом xmlns, задающим пространство имен XHTML http://www.w3.org/1999/xhtml. —> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <title>XHTML</title> </head> <body> <р>Подробности о разметке на сайте W3C: <а href="http://w3c.org/MarkUp/">
Ссылка на страницу </а> </р> </body> </html> Из этого примера вы, конечно, уже видите, что XHTML-документ является XML-документом (ведь он начинается с соответствующей строки) или, если угодно, приложением XML. Поэтому при написании XHTML-документа следует соблюдать следующие правила: 1. Документы должны быть правильно сформированы; это означает, что все элементы обязаны иметь закрывающие теги (например, <р></р>) или быть написаны в специальной форме (например, <br />); также должна соблюдаться корректная вложенность элементов. 2. XHTML-документы должны использовать нижний регистр для всех имен элементов и атрибутов HTML. 3. Все значения атрибутов, даже цифровые, должны быть заключены в кавычки или апострофы. 4. XML не поддерживает минимизацию атрибутов; пары атрибут/значение обязательно должны быть выписаны полностью. 5. Для непустых элементов необходимы конечные теги. Для того чтобы еще раз продемонстрировать отличие XHTML от HTML, рассмотрим следующие два документа. Файл 2 10 2.xhtml <!— это XHTML-документ. Все открывающий и <?xml version="l.0" encoding= <html xmlns="http://www.w3.or xml:lang="ru"> <body> <p> элементы должны иметь закрывающий теги "utf-8"?> g/1999/xhtml" В XHTML-документе все элементы должны иметь открывающий и закрывающий теги. </р> </body> <!-- Элемент html не имеет за крывающего тега —> -> При открытии документа 2 10 2.xhtml браузер выдает сообщение об ошибке (рис. 2.12). В то же время следующий HTML-документ Файл 2 10 3.html <!— это HTML-документ. Элементы р и html не имеют закрывающих тегов, но он нормально отображается браузером —> <html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <P> Мы не будем закрывать элемент р <р> И все равно браузер все нам покажет правильно </body> отображается правильно (рис. 2.13). G1 " j XHTML school w3c | v } j чПоиск ^ IffiBaepx * <^Подсаетка QXHTML Qschool Qw3c «file:///h...0_3.xhtml Я |анТМ|.\»ЗсгПоис... « : (cjW3CXHTML2Wo... X '. S>«TML Introduction X i О AOLRadlopower... X , * •* Ошибка синтаксического анализа XML: элемант не найден Адрес: file:W/home/prince/MY/MYPAPERS/2009/mathml_book/Examples_from_book/2_10_3.xhtml Строка 8, символ 1: Рис. 2.12. Сообщение об ошибке, выдаваемое браузером при открытии документа 2 10 2.xhtml Cf ^ [ doctypB html l^j j ЧПоиск v ЙВВаврх ^ ^Подсветка Qdoctype Qhtml ■:jdoclypohlml... К [jjGiTiaiHEmai.. xTSXHTMUnlro... К jOAOLRadiop... X j g| file:///..._2.html X lbhlhilbgoK.nl.... X I + v Мы не будем закрывать элемент р И все равно браузер все вам покажет правильно Рис. 2.13. Отображение браузером документа 2_10_3.xhtml Следует отметить, что отсутствие закрывающих тегов в HTML-документе является ошибкой, но браузер ее исправляет, и поэтому она незаметна. Однако мы ни в коем случае не можем рекомендовать читателю такой стиль написания HTML-документов. Дело в том, что когда вы пишете страницу правильно, то можете рассчитывать, что в браузере она будет отображаться, как вы и предполагали (забудем на секунду о «войне браузеров» и о том, что у Microsoft свои правила, отличные от общепринятых, и даже свой вариант HTML). Однако если вы рассчитываете на то, что браузер будет исправлять ваши ошибки, не обижайтесь, что результат может оказаться далек от ожидаемого («не стреляйте в пианиста, он играет, как умеет»). Поэтому пишите HTML-документы строго по правилам!
Для продвинутого читателя. Следует использовать минимизированный синтаксис для тегов пустых элементов, например, <br />, так как альтернативный синтаксис <brx/br>, допускаемый XML, дает непредсказуемые результаты во многих существующих браузерах. Кроме того, для совместимости с устаревшими браузерами следует писать пробел перед /> в одиночном пустом элементе. В документ следует включать объявление DOCTYPE, предшествующее корневому элементу html. Публичный идентификатор, включенный в объявление DOCTYPE, обязан быть ссылкой на одно из определений типа документа. О различных определениях DOCTYPE и их влиянии на отображение (Х)НТМ1_-документа в браузерах можно узнать, например, из материалов сайта http://xhtml.ru.
3. РАЗМЕТКА МАТЕМАТИЧЕСКИХ ТЕКСТОВ ПО ТЕХНОЛОГИИ MATHML MathML является специализированным языком разметки, основанным на XML. Он ориентирован на представление математической символики в электронном виде. В MathML реализовано два способа разметки математических выражений. Синтаксис математических формул записывается с помощью нотации Presentational MathML Markup (презентационный MathML) — его основной задачей является отображение математических текстов. Семантика формул, отражающая смысл математического выражения, передается с помощью Content MathML Markup (содержательный MathML). В настоящем руководстве мы уделяем основное внимание презентационному MathML. Это вызвано тем, что большинство имеющихся на сегодняшний день приложений ориентировано именно на презентационный MathML — сейчас активно идет процесс перевода математического контента в электронную форму. Содержательный MathML должен стать одной из ведущих технологий на следующем этапе, когда будут созданы программы, способные анализировать тексты. Работа над такими технологиями уже ведется в рамках проекта «Семантический веб». Содержательному MathML посвящено руководство [6], также он подробно освещен в книге [5]. 3.1. Вводный пример Выполним разметку текста, содержащего несложные (с точки зрения разметки) формулы. Этот текст достаточно просто воспроизвести с помощью любой издательской системы, поддерживающей математическую нотацию (например, семейство TrfX, MS Word + EquationEditor/MathType). Для разметки приведенного текста (рис. 3.1) будем использовать презентацион- Квадратное уравнение Корни квадратного уравнения ах2+ Ьх + с = 0 имеют вид -Ь± Vb2-4ac Рис. 3.1. Вводный пример
ный MathML и весь результирующий код оформим в виде XHML-файла. Сразу же заметим, что это не единственный способ представления на основе MathML — в разделе 3.2.1 в примере «Просмотр HTML-файла» MathML-код включен в файл HTML. Разметку этого фрагмента можно выполнить в стандартном текстовом редакторе любой операционной системы (например, в «Блокноте» MS Windows). Обращаем внимание на регистр, в котором набираются теги, — все теги, в том числе и привычные html-теги, набираются в нижнем регистре (здесь работают правила XHTML!). Файл 3_1_1.xml <?xml version="l.О" encoding="windows-1251"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Start Example</title> </head> <body> <Ы>Квадратное уравнение</Ы> Корни квадратного уравнения <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>a</mi> <msup> <mi>x</mi> <mn>2</mn> </msup> <mo>+</mo> <mi>b</mi> <mi>x</mi> <mo>+</mo> <mi>c</mi> <mo>=</mo> <mn>0</mn> </math> имеют вид <math xmlns="http://www.w3.org/1998/Math/MathML"> <msub> <mi>x</mi> <mrow> <mn>K/mn> <mo>,</mo> <mn>2</mn> </mrow> </msub> <mo>=</mo> <mfrac> <mrow> <mo>-</mo> <mi>b</mi> <mfrac linethickness="0"> <mo>+</mo> <mo>-</mo> </mfrac> <msqrt> <msup>
<mi>b</mi> <mn>2</mn> </msup> <mo>-</mo> <mn>4</mn> <mi>a</mi> <mi>c</mi> </msqrt> </mrow> <mrow> <mn>2</mn> <mi>a</mi> </mrow> </mfrac> </math> </body> </html> Поскольку это XHTML-файл, сохраним его с расширением .xml, — в нашем примере файлу дано имя 3_1_1.xml. Если разметка выполнялась с помощью «Блокнота», то, как и при подготовке html-документов, следует обратить внимание на тип файла — файл не должен быть текстовым (см. рис. 3.2). Посмотреть, что получилось, лучше всего с помощью браузеров Firefox или Mozilla — в них встроена поддержка MathML. Internet Рис. 3.2
Explorer требует установки дополнительного программного обеспечения, например, модуля MathPlayer (см. п. 3.2.1). Браузеры Mozilla и Firefox дают результат (если, конечно, не было ошибок при наборе кода), представленный на рис. 3.3. £te &it View History 05»- с х Ш Most Visited Q Getting S Q Start Example gookmarfs Tools Help taJ t L3 Se:///G:/MathM.-Book/Example-ft>r-Book/l. & tsrted &j Latest Headfines Q Windows Meda Q Windows I*i Квадратное уравнение Корни квадратного >равнения их + Ьх + С = 0 имеют вид Х\ 2 :! Й1 _ -*- ^02 2a -■tec P] Done .: Рис. 3.3. Отображение MathML в браузере Firefox ЯШ ОЛПримерьЛЗ l_bcml-Wiiwowslnt«i«tE4)lorer KuJ ' Ji_l Г>ЛПримеры\3_1_1 'И** XjP^ Live Search «Й- Избранное I •& <& " gj ' a - s El ■•' Страницач i 01>\Примеры\3.1.1"п1 J Ф В целях безопасности Internet Explorer не разрешает этому веб-узлу X выполнение сценариев или элементов управления ActiveX, которые могут... <?xml version="1.0" encoding="windows-1251" ?> <html xmlns="http://www.w3.org/1999/xhtmr> - <head> <tibe>Start Example</title> </head> - <body> <Ы>Квадратное уравнение</И1> Корни квадратного уравнения - <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>a</mi> - <msup> <mi>x</mi> |ф Компьютер | Защищенный режим: выкл. *a " Фдоо% Рис. 3.4. Отображение MathML браузером Internet Explorer Браузер Internet Explorer (без плагинов типа MathPlayer) отобразит только XML-дерево (рис. 3.4).
Теперь попытаемся разобраться в коде созданного нами файла. Первые две строки указывают, что данный документ представляет код XHTML. Напомним, что первая строка отмечает, что это XML-документ, а вторая <html xmlns="http://www.w3.org/1999/xhtml"> определяет пространство имен XHTML. Хотя эта строка и выглядит как ссылка, она является лишь уникальным идентификатором пространства имен, который распознается браузером, и, следовательно, не требует соединения с интернетом. Как мы помним (см. раздел 2.5), пространству имен назначается имя — идентификатор записывается после xmlns через «:», этот же идентификатор присутствует как префикс во всех тегах. Если же после xmlns ничего не указано, как в нашем примере, то используется пространство имен по умолчанию, и перед тегами уже нет префикса, указывающего на пространство имен. Для разметки текста используются стандартные теги HTML, а для представления формул — теги MathML. Блоки с кодом MathML помещаем в теги <math xmlns="http://www.w3.org/1998/Math/MathML"> </math> Открывающий тег <math . . . . > определяет ссылку на пространство имен MathML. Опять же, эта ссылка — всего лишь идентификатор, а не адрес веб-ресурса. В примере необходимо отобразить две формулы, поэтому он содержит два блока: <math> </math>. Больше всего в примере элементов mi, mn и mo — это элементы, с помощью которых производится разметка для идентификаторов, чисел и операций соответственно. В примере имеются элементы msup и msub, которые используются для отображения верхних и нижних индексов. Во второй формуле нижний индекс двойной, поэтому потребовалась группировка элементов, представляющих индекс. Для группировки использован элемент mrow, который предназначен для обозначения горизонтального ряда частей выражения. Элемент msqrt отвечает за представление квадратного корня, а элемент mfrac — за представление дроби. Символ «±» сконструирован в виде блока <mfrac linethickness= <mo>+</mo> <mo>-</mo> </mfrac> ■0"> Эти элементы создают дробь, в числителе которой стоит знак плюс, а в знаменателе — знак минус, и с разделительной линией нулевой толщины (на что указывает атрибут linethickness="0").
В документации и примерах по MathML для кодирования символа «±» используют также специальный символ &PlusMinus;, а для отображения небольшого пробела, заменяющего в формулах знак умножения, — специальный символ slnvisibleTimes;. Эти конструкции носят название «ссылочные сущности» (entity reference). Для продвинутого читателя. В XML определено два метода записи специальных символов: ссылка на сущность и ссылка по номеру символа. Сущностью (англ. entity) в XML называются именованные данные, обычно текстовые, в частности, специальные символы. Ссылка на сущность (англ. entity references) указывается там, где должна быть сущность; она состоит из амперсанда (&), имени сущности и точки с запятой (;). Вводный пример с использованием указанных сущностей можно переписать так: Файл 3 1 2.xml <?xml version="l.О" encoding="windows-1251"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN' "http://www.w3.org/Math/DTD/mathnil2/xhtml-mathll-f.dtd"> <?xml-stylesheet type="text/xsl" href = "http://www.w3.org/Math/XSL/pmathml.xsl"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Start Example</title> </head> <body> <ЫЖвадратное уравнение</Ь1> Корни квадратного уравнения <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>a</mi> <msup> <mi>x</mi> <mn>2</mn> </msup> <mo>+</mo> <mi>b</mi> <mi>x</mi> <mo>+</mo> <mi>c</mi> <mo>=</mo> <nm>0</nm> </math> иыеют вид <math xmlns="http://www.w3.org/1998/Math/MathML"> <math> <mrow> <mi>x</mi> <mo>-</mo> <mfrac> <mrow> <mo>-</mo> <mi>b</mi>
<mo>SPlusMinus;</mo> <msqrt> <mrow> <msup> <mi>b</mi> <mn>2</mn> </msup> <mo>-</mo> <mrow> <mn>4</mn> <mo>slnvisibleTimes;</mo> <mi>a</mi> <mo>&InvisibleTimes;</mo> <mi>c</mi> </mrow> </mrow> </msqrt> </mrow> <mrow> <mn>2</mn> <mo>SInvisibleTimes;</mo> <mi>a</mi> </mrow> </mfrac> </mrow> </math> </math> </body> </html> Для того чтобы сущности определились браузером, необходимо подключить ссылку на DTD-правила — это сделано с помощью элемента DOCTYPE .... Здесь использовались стандартные DTD-правила для математических текстов xhtml-mathil-f .dtd, разработанные консорциумом W3C, — ссылка в теге точно указывает, где найти этот файл (его можно скачать и самостоятельно разобраться с содержимым). 3.2. Особенности отображения в браузерах Пользователи MS Windows в основном используют браузер Internet Explorer, хотя в последнее время популярностью пользуются также Firefox и Opera, а также недавняя разработка компании Google — браузер Chrome. Поддержка MathML включена в браузеры Amaya, Firefox (с версии 0.91), Mozilla (с версии 1.3) и Opera. Браузеры Google Crome и Internet Explorer не могут распознать код, написанный на MathML, и способны отобразить только дерево XML (см. рис. 3.4). Для отображения MathML-кода в браузерах применяют несколько подходов. Использование таблиц каскадных стилей для отображения XML-кода подробно описано в учебниках [10, 26, 27]. Кроме того, имеется ряд программных средств для работы с MathML, использующих языки программирования С, С#, Java, JavaScript и др.
Браузер Internet Explorer (начиная с версии 6.0) можно научить понимать MathML, подключив специальный модуль, — подобные модули созданы IBM (модуль techexplorer) и Design Science (модуль MathPlayer). Браузеры Firefox и Mozilla отображают MathML одинаково, поэтому мы объясним различие в подготовке MathML-разметки для Internet Explorer и Mozilla. 3.2.1. Просмотр XML-файла, содержащего MathML-код. Универсальные математические стилевые таблицы. Как уже было показано в разделе 2.7, для отображения XML-документов можно использовать xsl-скрипты. Эту технологию можно применить и для xml-файлов, содержащих MathML-код. Консорциум W3C для отображения MathML-кода предложил использовать Универсальные стилевые таблицы MathML (Universal MathML stylesheet). Этот набор состоит из файлов mathml.xsl, pmathml.xsl, ctop.xsl и pmathmlcss.xsl. Их можно найти на сайте консорциума W3C в разделе Math/XSL. Там же размещены рекомендация по работе с этими файлами «Putting mathematics on the Web with MathML» и примеры. Использование универсальных стилевых таблиц позволяет создавать MathML-документы, которые будут отображаться в привычном формульном виде (а не просто в виде XML-дерева) всеми браузерами, не требуя установки специализированных плагинов. Уместно отметить, что ряд браузеров, например, модный сейчас Google Chrome, подобными плагинами пока не обеспечен. Более того, универсальные стилевые таблицы содержат код, позволяющий трансформировать Content Markup в Presentation Markup, и тем самым обеспечивают возможность отображать документы с содержательным MathML даже в тех браузерах, которые не поддерживают Content Markup (к их числу относится и знакомый нам браузер Mozilla). Примеры использования этих стилевых таблиц приведены ниже. Для продвинутого читателя. Стилевая таблица mathml.xsl (ниже мы приводим только наиболее существенную ее часть) на самом деле состоит из ссылок на стилевые таблицы ctop.xsl и pmathml.xsl. Стилевая таблица ctop.xsl содержит правила конвертации содержательного MathML в презентационный MathML, a pmathml.xsl — инструмент отображения презентационного MathML. Все эти стилевые таблицы можно скачать с сайта http://www.w3.org/Math/XSL/. Файл 3 2 l.xsl <!— Copyright David Carlisle 2001, 2002. Use and distribution of this code are permitted under the terms of the <a href="http://www.w3.org/Consortium/Legal/
copyright-software-19980720">W3C Software Notice and License</a>.—> <xsl:include href="ctop.xsl"/> <xsl:include href="pmathml.xsl"/> <xsl:output/> <xsl:template match="/"> <xsl:choose> <xsl:when test="system-property('xsl:vendor')= ' Transformiix' "> <xsl:apply-templates mode="c2p"/> </xsl:when> <xsl:otherwise> <xsl:apply-templates/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> Если документ содержит только презентационный MathML, как в большинстве примеров настоящей книги, то достаточно только файлов pmathml.xsl и pmathmlcss.xsl. Скрипт 3_2_1.xsl универсальный и его можно использовать для обработки как презентационного, так и содержательного MathML, — отображение в браузере в этом случае будет производиться несколько медленнее, чем при работе с файлом pmathml.xsl, — фактически файл mathml.xsl объединяет код всех указанных скриптовых файлов. Ссылку на файл, содержащий xsl-скрипт, требуется указать в самом начале xml-файла. <?xml version="l. <?xml-style£ <html xmlns= <head> <meta http- </head> <body> heet -"http equiv 0"?> type= "text/xsl" ://www.w3 = "Con tent- href="pmathml org/1999/xhtml -Type" content=' '> xsl"?> text/html' /> Здесь предполагается, что файл pmathml.xsl размещен в одном каталоге с создаваемым XML-файлом, в противном случае необходимо указать полный путь к нему в нотации URI, например, <?xml version="l.0"?> <?xml-stylesheet type="text/xsl" href="file:///C/examples-MathML/pmathml.xsl"?> Файл с xsl-скриптом можно и не копировать в рабочий каталог, а сослаться непосредственно на сайт консорциума: <?xml version="l.0"?>
<?xml-stylesheet type="text/xsl" href = "http://www.w3.org/Math/XSL/pmathml.xsl"?> <html xmlns="http://www.w3.org/1999/xhtml"> Каждый фрагмент MathML заключается в теги: <math xmlns="http://www.w3.org/1998/Math/MathML"> </math> а в конце файла не забудьте поставить закрывающие теги </body> </html> 3.2.2. Особенности отображения MathML в браузерах Mozilla и Firefox. При подготовке вводного примера было предложено тестировать его в браузере Firefox, поскольку поддержка MathML в него встроена. При отображении математических формул в этом браузере, возможно, потребуется дополнительно установить шрифты, — Firefox сообщит о такой необходимости выводом соответствующего окна (рис. 3.5), в котором укажет, где можно найти необходимые шрифты. Missing MathML Fonts I ??_ /i\ To properly display the MathML on this page you need to install the following fonts ci-J CMSY10. CMEX10. Mathl. MathZ MatM. For further information see http://www.mozilla.oro/projects/mathml/fonts OK Рис. З.5. Сообщение браузера Firefox о необходимости установки шрифтов Еще одна рекомендация — использовать объявления MathML DTD, предлагаемые консорциумом W3C: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN "http://www.w3.org/Math/DTD/mathml2/xhtml-mathll- f.dtd"> Файл 3 2 2.xml <?xml version="l.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN "http://www.w3.org/Math/DTD/mathml2/xhtml-mathll-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <headxtitle> MathML Example </title></head> <body> <p> This is an example:</p> <p> <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> <msup><mi>x</mixmn>2</mnx/msup> <mo>-</mo> <mrow> <mn>2</mnXmo>&InvisibleTimes;</mo><mi>x</mi> </mrow> <mo>+</moXmn>K/mn> </mrow> </math> </p> </body> </html> Отметим, что Mozilla, а также Firefox поддерживают только презентационный MathML. Однако применение Универсальных стилевых таблиц позволяет обрабатывать файлы, содержащие фрагменты Content Markup. Любой из примеров раздела 4 можно выполнить в браузерах Firefox и Mozilla, добавив в заголовок файла код подключения файлов Универсального стиля: Файл 3 2 З.хгп! <?xml version="l.0"?> <?xml-stylesheet type='text/xsl' href='mathml.xsl'?> <math xmlns="http://www.w3.org/1998/Math/MathML"> <apply> <power/> <apply> <plus/> <ci>x</ci> <cn>2</cn> </apply> <cn>4</cn> </apply> </math> При загрузке файла 3_2_3.xml в браузер Firefox получим правильное представление формулы (рис. 3.6). Для продвинутого читателя. XSLT-процессор браузера Firefox, используя стилевую таблицу mathml.xsl, конвертирует код, содержащийся в приведенном примере, из формата содержательного MathML в презентационный MathML, который затем и обрабатывается браузером. В этом можно убедиться, просмотрев исходный код фрагмента (рис. 3.7).
Ф Mozilla Firefox ±£^a*\£№ffitoi6'i.LM _> g-i И il£3«i Файл Правка Вид Журнал Закладки Инструменты С ф> Начальная страница &» Последние заголовки (х+2)4 ■ Готово ^■^■$'Ш-^&ъщ1Фттщ&1&®1№г«&ть4-'' ■*>• ?&^**ж ^.ж^лмущ Рис. 3.6. Представление файла 3_2_3.xsl в браузере Firefox DOM Source of Selection - Mozilla Firefox - п x 0? Edit Yjev» tjdp <mml: msup xmln s: mnls *ьчГ "aXaG"'SVs5S^ "http Ж1 //www .w3 org/1998/Mai:h/Mai:hMI."Xnmil mrowxmml •mo> ■> Рис. З.7. Исходный код фрагмента в браузере Firefox 3.2.3. Особенности отображения в Internet Explorer. Как мы уже видели на рис. 3.4, формулы, записанные с помощью элементов MathML, отображаются в виде дерева. Чтобы появились настоящие формулы, необходим пакет MathPlayer. Эта программа разработана компанией Design Science и свободна для скачивания с сайта http://www.dessci.com/en. В каждом сеансе работы с IE при открытии MathML-файла загружается MathPlayer, сообщая о себе выводом соответствующего окна (рис. 3.8). MathPlayer у>гяюп 3 Id » и MathPlayer Home Page MathPlayer™* is a product of Design Science, Inc. Copyright ^2002-2008. All rights reserved. The Team: Paulloppmg, Robert Miner, Enc Lee, Neil Soiffer, Kyle Spffler, Eduardo Tabacman, Karl Valentine-Rothenberg Ш Design Science How •i(lrtlCf^^eчllrmlllll.lte^^ Рис. З.8. Сообщение о загрузке MathPlayer при работе с браузером IE
При работе в операционных системах MS Windows с активным Центром безопасности потребуется отключить блокирование выполнения сценариев (рис. 3.9). : £$ E:\LEK\MjthML-Book\E... ; Э т 0 ' J i ' Страница » Безопасность » V В целях безопасности Internet Expforer не разрешает этому веб-узлу вь Разрешить заблокированное содержимое... Факторы риска Справка панели информации Неге is ьише iiiriin x-z ■ИРИДИЯ! MathPlayer Version 2.1d » т HathPlaver Home Page A At МаглгНауег"" is a product of Design Science, Inc. Copyright Ф2002-2008. AH rights reserved. Tne Team: Paul Topping, Robert Miner, Enclee, Heil Soiffer, Kyle'SpSier, Eduardo Tabacman, Kart Valentine-Rothenberg Рис. З.9. Отключение блокирования выполнения сценариев Пример XML-файла для браузера Internet Explorer. Код, приведенный в примере, можно набрать в обычном Блокноте. Поскольку в тексте есть информация на русском языке, необходимо вместо кодировки по-умолчанию (попробуйте вспомнить!) использовать «windows-1251». Файл 3 2 4.xml <?xml version="l.О" encoding="windows-1251"?> <?xml-stylesheet type="text/xsl" href="pmathml.xsl"?> •chtml xmlns="http: //www.w3 . org/1999/xhtml"> <head> •cmeta http-equiv="Content-Type" content="text/html" /> </head> <body> <p> Рассмотрим следующее выражение: -cmath xmlns="http://www.w3.org/1998/Math/MathML"> <msqrt> <mi>a</mi> <mo>+</mo> <mi>b</mi> </msqrt> </math> </p> </body> </html>
Открыв файл 3_2_4.xml в браузере Internet Explorer, вы должны увидеть картинку, представленную на рис. 3.10. Осталось только разрешить выполнение сценариев (рис. 3.11). (^УТрииеры стилей W 1ШШ Имя ]ТТип Размер |Дата 03_2_4 £gctop .^jirtathiTil jgfipmathml <Папка>03.03.2010 17:05 xml 438 03.03.201017:01 xsl 41788 18.08.2009 16:42 xsl 1151 18.08.2009 16:42 xsl 20 613 18 08 2009 16 34 0:\Примеры\3_2_4о[т1 - Windows Internet Explorer ■gf Избранное | ^ jg Е):\Примеры\3_2_4лт1 Рассмотрим следующее выражение: ^a + b |в Компьютер | Защищенный режим: выкл. Рис. 3.10. Представление файла 3_2_4.xml в браузере IE |Разнер ЦДата Атрибуты- Si2 jj^pmathml xml Internet Explorer xsl <£ EUEIftMathML-Boot\Examp(e-MathPlayef\IE\2jtml -WindowsIn< OG j ErUEKVMathML-Bo RfP Live Search <£f Избранное | ^ Щ Рекомендуемые сайты ** Ц^ КоллекЦ; j £8 b\LEK\MathML-Book\E.. ; | {•% " ffi ' L3 J_ Заблокированное активное содержимое Отключенная надстройка Справка панели информации Г£) Как правило, сценарии не опасны. Разрешить ПГ выполнение сценариев? Разрешить заблокированное содержимое... Факторы риска Рассмотрим следующее выражение: *ja + b |Ф Компьютер t Защищенный режим: выкл. /fl * 9^100% Рис. 3.11. Разрешение выполнения сценариев Пример HTML-файла для браузера Internet Explorer. Приведем простейший пример html-файла, содержащего MathML- код, который использует MathPlayer для отображения.
Файл 3 2 5.html -chtml xmlns:m="http://www.w3.org/1998/Math/MathML"> <head> -COBJECT ID=examplel CLASSID="clsid:32F66A20-7614-llD4-BDll-00104BD3F987"> </OBJECT> <?IMPORT NAMESPACE="M" IMPLEMENTATION="#examplel"> </head> <body> <p> Рассмотрим следующее выражение <m:math> <m:msqrt> <m:mi>a</m:mi> <m:mo>+</m:mo> <m:mi>b</m:mi> </m:msqrt> </m:math> </p> </body> </html> MathPlayer подключается при помощи тега object. В нем указывается атрибут id, значение которого нужно выбрать самим (это же значение используется в теге import). Это стандартный способ подключения внешних программ по технологии ActiveX: если приложение (в примере — это браузер) не умеет работать с каким-либо типом файлов (в нашем случае, MathML), можно вызвать инструмент, подходящий для этого типа файлов (в примере это MathPlayer). Подобным образом, т.е. через object, на веб-страницах подключаются и другие программы, например, для просмотра мультимедийных файлов примерно так же вызывается медиаплеер. Атрибут classid указывает на номер объекта ActiveX в реестре — запись в реестре появляется при установке соответствующей программы (рис. 3.12). Чтобы не вводить длинную цепочку знаков clsid:32F66A20-7614- 11D4-BD11-00104BD3F987, советуем просто скопировать через буфер :#'рэда1СТор;'^^ ? Файл Правка ' Вид ' Избранное Справка ... : *-.к сито ; . » Ji (00000001-4FEF-40D3-B3FA-E0531B897F98) | [ ■ > -J, {32DA2B15-CFED-llDl-B747-0OCO4FC2B085}g I I : !> -X- (32E7DO3-1E22-4D7E-8AC7-D2E71BDE8042} J ! л - £j (32F66A20-7614-UD4-BD11-00104BD3F987) E ! | 4b InprocServer32 8 Js} InstalledVersion ; . ■■ j, P'ogiD 1 ■■ X VersionlndependentProgID T 1 ' L«±!a-~'il~i>-..—J ' Имя Тип Значение *■>) (По умолчанию) REG_SZ MathPlayer by Design Science , 4 1- .■ VAAw^..«^UM.n.^.i«^i4«.u*y.fl«l * KoMnbKjTep\HKEY.CLASSES.ROOT\CLSID\(32F66A20-7ea4-llD4-BDU^)0104BD3F987) Рис. 3.12. Фрагмент реестра
обмена этот блок из уже готового примера — пример можно взять как с сайта данной книги, так и с сайта разработчика модуля MathPlayer (http://www.dessci.com/en/). Этот файл следует сохранить как обычный HTML-файл, т.е. с расширением .htm или .html. В html-файл можно добавить скрипт, который проверяет версию браузера. Примерно такой же код получается при конвертации Т^Х-файлов в MathML программой Tf?X4ht (см. раздел 6.5). Начало файла содержит следующие обязательные строки: <html xmlns: xmlns= <head> <object id= classid </object> Ti="http: ■http:// 'MathPlc ="clsid: <?import namespace= </head> //www.w3.org/1998/Math/MathML" www yer w3.org/1999/xhtml" > 32F66A20-7614-11D4-BD11-00104BD3F987"> ="m" implementation="#MathPlayer" ?> В начале раздела body надо вызвать MathPlayer: <body> <!—1. 31—> <p class="noindent"> <script language="javascript"> <! — if( navigator.appName=="Microsoft Internet Explorer" && navigator.platform=="Win32" && parseFloat(navigator.appVersion.substr( navigator.appVersion.indexOf("MSIE ")+5))>="5.5" ){ try { var oMP = new ActiveXObject("MathPlayer.Factory.1") ; > catch(e) { alert("Can't find Design Science's MathPalyer" + "(http://www.dessci.com/webmath/mathplayer)");} } else { alert("Requires MSIE version 5.5 or later"); } —> </script> </p> Синтаксис MathML-разметки также отличается от рассмотренной ранее xml-версии. Именно, каждый тег начинается с <т:, например: <т <т <т <т math> mi>T</m то>=</т mi>A</m </m:math> mi> mo> mi>
Формально это выглядит как использование CSS (Cascade Style Sheets), однако фактически соответствующий CSS-лист встроен в MathPlayer. В частности, можно использовать атрибут class, например, <т <т math display="inline"> mrow> <m:mo class="MathClass-open">[</m <m:mrow> <m: msub> <m: mrowxm: mi>W</m <m: mrowXm: mn>0 </m </m:msub> mo> : mix/m :mrow> :mn></m:mrow> <m:mo class="MathClass-punc"> <m:msub> <m: mrowXm: mi>L</m: mix/m <m: mrowXm: mi>X</m: mix/m </m:msub> </m:mrow> <т:то class="MathClass-c </m:mrow> <т <т <т <т mo class="MathClass-bin mi> Y </m:mi> mo class="MathClass-rel mi> Y </m:mi> </m:math> _ose">]</m </m:mo> mrow> mrow> mo> '>S#x00D7;</m:mo> '>=</m:mo> При просмотре этот фрагмент выглядит так, как показано на рис. 3.13. Address |@ C:\Ptstore\EJoumals\iematlvtest.HTML [Щ.1х]хГ=Г Рис. 3.13. Результат просмотра фрагмента Обработка HTML-файла в браузера Internet Explorer. С помощью javascript проверяем наличие MathPlayer и версию браузера: Файл 3_2_6.html -chtml xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns="http://www.w3.org/1999/xhtml"> <head> •Cobject id="MathPlayer" classid="clsid:32F66A20-7614-llD4-BDll-00104BD3F987"> </object> <?import namespace="m" implementation="#MathPlayer" ?>
<!—http://www.dessci.com/webmath/mathplayer/--> </head> <body> <!--l. 31—><p class="noindent"> <script language ="javascript"> if( navigator.appName=="Microsoft Internet Explorer" SS navigator.platform=="Win32" && parseFloat(navigator.appVersion.substr( navigator.appVersion.indexOf("MSIE")+5))>="5.5" ){ try { var oMP = new ActiveXObject("MathPlayer.Factory.1"); } catch(e) ( alert("Can't find Design Science's Math-Palyer" + "(http://www.dessci.com/webmath/mathplayer)");} } else { alert("Requires MSIE version 5.5 or later"); } —> </script> </p> <p> Рассмотрим следующее выражение: <m:math> <m:msqrt> <m:mrow> <m:mi>a</m:mi> <m:mo>+</m:mo> <m:mi>b</m:mi> <m:mrow> </m:mrow> </m:msqrt> </m:math> </p> </body> </html> Вы должны увидеть картинку, изображенную на рис. 3.14. Рис. 3.14. Просмотр файла 3_2_6.html
Для продвинутого читателя. Пожалуй, все математики знакомы с Equation Editor в MS Office и программой MathType — оформление математических работ часто выполняется с их помощью. Эти известные продукты разработаны компанией Design Science (DSI). На сайте компании www.dessci.com отмечено, что в качестве стратегической задачи ставится внедрение интернет-технологий в научную среду. Основная роль при этом отводится программным решениям, основанным на XML-технологиях и особенно на MathML. К работе привлечены известные специалисты, упомянем лишь Роберта Майнера (Robert Miner) (http://www.geom.uiuc.edu/rminer/). Его идеи были использованы при создании программы MathPlayer и других продуктов, предназначенных для работы с MathML.
4. СИНТАКСИС ЯЗЫКА MATHML ПРЕЗЕНТАЦИОННЫЙ MATHML Из примеров, приведенных в предыдущих разделах, мы видим, что разметка MathML достаточно громоздкая, поэтому вручную ввести реальный текст достаточно сложно (впрочем, если читатель привык к TgX-набору, то без особого труда справится с MathML-набором; надо лишь использовать редактор с автозаменой). В дальнейшем мы опишем программы, которые автоматически генерируют MathML-код (см. гл.6). Тем не менее, надо иметь представление о синтаксисе языка, так как часто приходится исправлять сгенерированный код вручную. Если мы проанализируем уже приведенные примеры, то увидим, что каждый токен (элемент) формулы заключается в тег с атрибутами, указывающими его специализацию. Например, число заключается в тег <mn> </mn>, операция — в <то> </то>, символ — в <mi> </mi>. При этом теги могут быть вложены друг в друга. Таким образом, выражения MathML можно представить в виде деревьев, где каждый узел соответствует элементу MathML, ветвь под «родительским» узлом — «дочерним» узлам и листья дерева — атомарным элементам нотации или содержания, таким, как числа, символы и т.д. Все элементы MathML делятся на три группы: элементы представления, элементы содержания и интерфейсные элементы. Элементы представления описывают визуально ориентированную двухмерную структуру математической нотации. Типичными примерами являются элемент mrow, который обычно применяется для обозначения горизонтального ряда частей выражения, и элемент msup, который отмечает верхний индекс. Как правило, каждый элемент представления соответствует одному типу нотационной схемы, такой, как ряд, верхний индекс, нижний индекс и т.д. Любая формула состоит из частей, которые могут состоять из простейших элементов, таких, как цифры, буквы или другие символы. Разметка MathML состоит из приблизительно 30 элементов, которые имеют более 50 атрибутов. Элементы представления делятся на два класса: токены и элементы схемы. Токены (token elements) представляют индивидуальные символы, названия, числа, обозначения и т. д. В основном в качестве содержания токены могут иметь только символы. Единственными исключениями являются элемент вертикального выравнивания malignmark, mglyph и ссылки на сущности (entity references). Элементы схемы (layout schemata) формируют выражения из частей и могут иметь в качестве содержания только элементы (исключая
пробелы, которые они игнорируют). Также имеется несколько пустых элементов, используемых только вместе с определенным элементом схемы. Все индивидуальные «символы» в математическом выражении должны быть представлены токенами MathML. Основными типами токенов MathML являются идентификаторы (т.е. переменные или имена функций), числа и операторы (включая ограничители, такие, как различные виды скобок, и разделители, такие, как запятые). Имеются также токены дли представлении текста или пробелов, что имеет больше эстетическое, чем математическое значение, и для представления «строчных констант» (string literals) для совместимости с системами компьютерной алгебры. Надо заметить, что хотя токен представляет одиночную смысловую единицу (имя, число, знак, математический символ и т.д.), такая единица может состоять более чем из одной литеры (character). Например, sin и 24 представлены одиночными токенами <mi>sin</mi> и <mn>24</mn> соответственно. Далее мы приведем основные элементы MathML (более подробное изложение с перечислением всех тегов и многочисленных атрибутов можно найти в [3], гл.З). 4.1. Токены Тег mi mn mo mtext ms Определение идентификатор (identifier) число (number) оператор (operator), ограничитель (fence) или разделитель (separator) текст (text) текстовая строка (string literal) Пример <mi> a </mi> <mn> 1324 </mn> <mo>+</mo> <mtext> Это пример </mtext> <ms> HHHHHHH</ms> Применение основных токенов ясно из вышеприведенных примеров. 4.2. Основные элементы Тег mrow mfrac Определение группирует любое количество подвыражений в строку формирует дробь из двух подвыражений Пример см. вводный пример <mfrac> <mi>a</mi> <mi>b</mi> </mfrac> Результат a b
msqrt mroot mpadded mphantom mfenced формирует квадратный корень (радикал без индекса) формирует радикал с определенным индексом регулирует отступы вокруг содержимого делает содержимое невидимым, но сохраняет его размер окружает содержимое парой скобок <math> <msqrt> <mi>a</mi> <mo>+</mo> <mi>b</mi> </msqrt> </math> <math> <mroot> <mrow> <mi>a</mi> <mo>+</mo> <mi>d</mi> </mrow> <mrow> <mi>b</mi> <mo>+</mo> <mi>c</mi> </mrow> </mroot> </math> <math> <mpadded width="+5em"> <mi>a</mi> <mo>+</mo> <mi>b</mi> </mpadded> <mo>-</mo> <mi>c</mi> </math <math> <mi> x </mi> <mphantom> <mo> + </mo> <mi> у </mi> </mphantom> <mo> + </mo> <mi> z </mi> </math> <math> <mfenced> <mi>x</mi> </mfenced> </math> y/a + b b^a + d a + b — с x + z (x)
4.3. Индексы Тег msub msup msubsup munder mover munderover Определение добавляет нижний индекс к основанию добавляет верхний индекс к основанию добавляет верхний и нижний индексы к основанию добавляет символ под основанием добавляет символ над основанием добавляет символы одновременно и над, и под основанием Пример <math> <msub> <mi>x</mi> <mn>K/mn> </msub> </math> <math> <msup> <mi>x</mi> <mn>12</mn> </msup> </math> <math> <msubsup> <mi>x</mi> <mn>z</ran> <mn>12</mn> </msubsup> </math> <math> <munder> <mi>X</mi> <mi>h</mi> </munder> </math> <math> <mover> <mi>X</mi> <mi>h</mi> </mover> </math> <math> <munderover> <mi>X</mi> <mi>h</mi> <mi>t</mi> </munderover> </math> Результат X\ X12 *\2 X h h X t X h
mmulti- scripts добавляет мультииндек- сы к основанию <math> <iranultiscripts> <mi> R </mi> <mrow> <mi> i </mi> <mi> k </mi> </mrow> <mrow> <mi> j </mi> </mrow> </iranultiscripts> </math> #'t г к 4.4. Более сложные примеры В этом разделе приведем несколько примеров, построенных на основе элементов, описанных в предыдущем разделе. Мы не останавливаемся на используемых здесь атрибутах, так как эта техническая информация содержится в работе [3], гл. 3. 4.4.1. Формула сокращенного умножения Код MathML: <math display="inline"> <msup> <mrow > <mrow> <mo class="MathClass-open">(</mo> <mrow> <mi>a</mi> <mo class="MathClass-bin">+</mo> <mi>b</mi> </mrow> <mo class="MathClass-close">)</mo> </mrow> </mrow> <mrow> <mn>2</mn> </mrow> </msup> <mo class="MathClass-rel">=</mo> <msup> <mrow> <mi>a</mi> </mrow> <mrow> <mn>2</mn> </mrow> </msup> <mo class="MathClass-bin">+</mo>
<mn>2</mn><mi>a</mi><mi>b</mi> <mo class="MathClass-bin">+</mo> <msup> <mrow> <mi>b</mi> </mrow> <mrow><mn>2</mn> </mrow> </msup> </math> Результат: (a + b)2 = a2 + 2ab + b2 4.4.2. Основное тригонометрическое тождество. Код MathML: <math display="inline"> <msup> <mrow> <mo class="MathClass-open"> <mrow> <mo class="MathClass-op <mrow> <mi >x</mi> </mrow> <mo class="MathClass- </mo> </mrow> </mrow> <mrow> <mn>2</mn> </mrow> </msup> <mo class="MathClass-bin"> <msup> <mrow> <mo class="MathClass-open"> <mrow> <mo class="MathClass-op <mrow> <mi >x</mi> </mrow> <mo class="MathClass- </mo> </mrow> </mrow> <mrow> <mn>2</mn> </mrow> </msup> <mo class="MathClass-rel"> <mn>K/mn> </math> (</mo> '>sin</mo> close">) +</mo> (</mo> '>cos</mo> -lose">) =</mo>
Результат: (sinx)2 + (cosx)2 = 1 4.4.3. Формула с греческими буквами и символом частного дифференцирования. Для задания букв греческого алфавита и различных математических символов в MathML-коде используют сущности, соответствующие символам юникода [28]. Код MathML: <math display="inline"> <msufc» <mrow><mi>i#x2202;</mi></mrow> <mrow><mi>i</mi></mrow> </msub> <mrow> <mo class="MathClass-open">[</mo> <mrow> <mover accent="true"> <mrow> <mi>i#x03Bl;</mi> </mrow> <mo class="MathClass-op">&#x2192;</mo> </mover> <mo class="MathClass-punc">, </mo> <mover accent="true"> <mrow><mi>i#x03B2;</mi></mrow> <mo class="MathClass-op">&#x2192;</mo> </mover> </mrow> <mo class="MathClass-close">]</mo> </mrow> <mo class="MathClass-rel">=</mo> <mover accent="true"> <mrow><mi>&#x03B3;</mi></mrow> <mo class="MathClass-op">&#x2192;</mo> </mover> </math> Результат: di[S.0] = ^ 4.4.4. Матрица. При написании MathML-кода матрицы используются следующие теги: Тег mtable mtr mtd Определение таблица или матрица строка в таблице или матрице одна ячейка в таблице или матрице
Код MathML: <math display="block"> <mfenced separators="" open="(" <mrow> <mtable> <mtr> <mtd> <mi>A</mi></mtd> <mtd> <mi>B</mi> </mtd> </mtr> <mtr> <mtd><mi>C</mix/mtd> <mtd><mi>D</mi></mtd> </mtr> </mtable> </mrow> </mfenced> </math> close=")" > Результат: 4.4.5. Коммутативная диаграмма. Используя матрицы, можно построить коммутативные диаграммы. MathML-код: <math display="block"> <mtable > <mtr> <mtd> <mi>A</mi> </mtd> <mtd> <mover> <mrow> <mo class="MathClass-rel">S#x2192; </mo> </mrow> <mrow><mi>f</mi></mrow></mover> </mtd> <mtd> <mi>B</mi> </mtd> </mtr> <mtr> <mtd> <mi>S#x2193;</mi> </mtd> <mtd>
</mtd> <mtd> <mi>&#x2191;</mi> </mtd> </mtr> <mtr> <mtd> <mi>C</mi> </mtd> <mtd> <munder> <mrow> <mo class="MathClass-rel"> S#x2192; </mo> </mrow> <mrow><mi>g</mix/mrow> </munder> </mtd> <mtd> <mi>D</ml> </mtd> </mtr> </mtable> </math> Результат: A 1 С f } 9 В T D
5. СИНТАКСИС ЯЗЫКА MATHML. СОДЕРЖАТЕЛЬНЫЙ MATHML Основная цель презентационного MathML — отображение математических формул, прежде всего, в браузере. Однако, как отмечается в [3], глава 4, математическая формула и ее визуальное представление — это разные вещи. Например, суммирование или произведение имеют специальный смысл для многих приложений (компьютерных программ) совершенно независимо от того, как эти операции записываются или читаются. Цель разметки содержания в MathML — обеспечить явное представление математической структуры выражения, а не частный способ его записи. Нашему читателю, как математику, конечно, эта идея совершенно понятна. Также очевидны перспективы применения такого представления: это и программы символьных вычислений, и обмен данными между такими программами по сети; значительно расширяются возможности обработки математического текста, в частности, возможности поиска. В целом содержательный MathML позволяет перейти на качественно новый уровень решения задачи компьютерной обработки математической информации. Так как математика постоянно развивается (к нашей с вами радости), то постоянно изменяется и развивается математическая нотация. Поэтому в содержательном MathML тщательно отобраны основные математические конструкции, которые достаточны для большинства приложений. Кроме того, предусмотрено семантическое описание для вновь вводимых математических обозначений, что позволяет расширять набор базовых конструкций. В содержательном MathML в той или иной степени отражены стандартные конструкции следующих математических дисциплин (приблизительно в объеме школьной математики и первых двух курсов университета): арифметика, алгебра, логика, теория множеств, линейная алгебра, математический анализ. Цель данного раздела — дать краткое описание содержательного MathML и привести ряд примеров, показывающих возможности этого языка разметки. Более подробную информацию читатель может найти, прежде всего, в [3], глава 4, и в монографиях [5] и [6]. Содержательный MathML построен на следующих принципах: • дерево математического выражения должно непосредственно кодироваться элементами содержательного MathML;
• набор элементов должен содержать базовые математические конструкции; • необходим механизм ассоциирования математического значения с конструкциями содержательного MathML. Содержательный MathML включает около 150 элементов и двенадцать атрибутов. В книге [5] (см. также [3], глава 4) выделены следующие категории элементов: токены; конструкторы; операторы и функции; квалификаторы; константы и символы; элементы семантического преобразования. Список всех элементов содержательного MathML, разбитых на категории по типам элементов, выглядит следующим образом. Категория Токены Основные элементы Арифметика, алгебра, логика Отношения Элементарные функции Теория множеств Последовательности и ряды Линейная алгебра Анализ Статистика Элементы ci, en, csymbol apply, lambda, declare, rein, fn, set, list, vector, matrix, matrixrow, interval, piecewise, piece, otherwise, domain, codomain, image, inverse, ident plus, minus, times, divide, power, root, quotient, rem, exp, factorial, max, min, gcd, abs, conjugate, arg, real, imaginary, 1cm, floor, ceiling, and, or, xor, not, implies, forall, exists eq, neq, gt, It, geq, leq, equivalent, approx, factorof, tendsto, in, notin, subset, prsubset, notsubset, notprsubset exp, In, log, sin, cos, tan, sec, cosec, cot, sinh, cosh, tanh, sech, cosech, coth, arcsin, arccos, arctan, arcsec, arccosec, arccot, arcsinh, arccosh, arctanh, arcsech, arccosech, arccoth set, list, union, intersect, setdiff, card, cartesianproduct sum, product, limit determinant, transpose, selector, vectorproduct, scalarproduct, outerproduct int, diff, partialdiff, grad, divergence, curl, laplacian mean, median, mode, var, sdev
Квалификаторы Константы и символы Элементы семантического преобразования bvar, lowlimit, uplimit, degree, logbase, domainofapplication, momentabout pi, exponentiale, eulergamma, infinity, imaginaryi, true, false, emptyset, notanumber, integers, reals, rationale, complexes, primes, naturalnumbers semantics, annotation, annotation-xml Токены — это единственные элементы содержательного MathML, которые могут содержать символьные данные. Все остальные элементы могут содержать только подэлементы. Существует три токена: en, ci и csymbol. Элемент сп — это аналог элемента тп презентационного MathML. Предназначен для представления чисел. Его содержание — знаки «+» или «-» (может отсутствовать) и строка цифр, возможно содержащая точку. Также этот элемент может содержать сущность, которая представляет численную константу, например, &pi;. По умолчанию содержание элемента сп интерпретируется как вещественное число со знаком, записанное в десятичной системе счисления. Элемент сп может иметь атрибуты type, base, definitionURL, encoding которые задают, соответственно, тип числа, основание системы счисления, адрес URI, где расположено описание этого числа, и, наконец, кодировку, в которой дано это описание. Примеры чисел и их представлений Целое число 457 Рациональное число 2/3 Вещественное число 12.438 Комплексное число 2+3i Комплексное число в тригонометрической форме 1+i Число 763 в восьмеричной системе исчисления Константа т, определение (или другая семантическая информация) находится по адресу http://www.constants.org <cn type="integer">457</cn> <сп type="rational">2<sep/>3</cn> <cn type="real">12.438</cn> <cn type="complex- cartesian">2<sep/>3</cn> <cn type="complex-polar"> 1.414<sep/>0.7854 </cn> <cn base="8">763</cn> <cn type="const" definitionURL="http://www.const ants.org> &\tau; </cn>
Замечания: 1) атрибут base может принимать значения от 2 до 36; 2) при записи комплексного числа в тригонометрической форме его модуль и аргумент представляются рациональными числами, записанными в виде конечной десятичной дроби, поэтому это представление приближенное (см. пример выше); 3) атрибут definitionURL, конечно, не обязательно указывает на веб-страницу; он указывает адрес источника семантической информации, который может быть чем угодно: файлом на локальном компьютере, записью в базе данных, ссылкой на книгу или статью и т.д.; использование этой информации — это целиком задача приложения, которое будет обрабатывать данный MathML-документ. Элемент ci — это аналог элемента mi презентационного MathML. Предназначен для построения имен переменных. В качестве содержимого может иметь любой текст в разметке презентационного MathML. Например, <ci> <msub> <mi>d</mi> <mn>l</mn> </msub> </ci> описывает переменную с именем d. Отметим, что с «точки зрения» презентационного MathML здесь имеются два символа, один из которых является индексом; содержательный MathML рассматривает это как единое имя переменной. Элемент ci допускает атрибуты type, значением которого может быть любая строка, в частности, и встроенные типы (например, integer, real и т.д., о которых мы говорили при описании элемента сп), а также конструкторы (см. далее). Элемент csymbol служит для описания символов, определенных во внешних документах в форматах, отличных от MathML. Например, константа Больцмана может быть описана с помощью этого элемента следующим образом: <csymbol encoding="text" definitionURL= "http://www.example.org/universalconstants/Boltzmann.htm"> k </csymbol> Здесь атрибут definitionURL указывает на адрес текста, в котором содержится определение константы Больцмана, a encoding описывает синтаксис определения. Предполагается, что с помощью этого значения приложение может решить, каким образом обрабатывать это определение.
Другой пример — это определение функции Бесселя в формате OpenMath: <csymbol encoding="OpenMath" "http://www.openmath definitionURL= org/cd/hypergeo2#BesselJ"> <msub><mi>J</mi><mn>0</mn></msub> </csymbo! L> Конструкторы. Эти элементы используются для построения выражений из токенов и элементов, представляющих функции и операторы. Конструкторами являются следующие элементы: apply, interval, list, matrix, matrixrow, set, vector, lambda, piecewise, piece, otherwise Кроме них в содержательный MathML 2.0 включены (для обратной совместимости) и элементы rein, fn из версии 1.0, но их употребление не рекомендуется. Назначение каждого элемента математику понятно из его названия, а как его использовать, объяснено в [3], глава 4. Мы ограничимся тем, что приведем несколько примеров. Примеры конструкторов Элемент apply применяется для описания применения функции или оператора к набору аргументов. Почти все конструкции выражений в содержательном MathML получаются в результате применения операторов и функций к аргументам. Первый потомок элемента apply — это применяемый оператор, остальные — это аргументы или квалификаторы. Следует отметить, что концептуально элемент apply необходим для того, чтобы в разметке отличать применение оператора или функции к набору аргументов и результат такого применения. Если объект, который применяется как оператор, не объявлен заранее как оператор, то он, тем не менее, понимается в качестве такового. Приведем несколько примеров. Сумма х + у записывается следующим образом: <apply> <plus/> <ci>x</ci> <ci>y</ci> </apply> Применение суммы двух функций / и д к аргументу х + у, т.е. выражение (/ + д)(х + у), выглядит так: <apply> <apply> <plus/>
<ci>f</ci> <ci>g</ci> </apply> <apply> <plus/> <ci>x</ci> <ci>y</ci> </apply> </apply> Произведение суммы двух переменных / и д и суммы переменных х и у, т. е. выражение (/ + д)(х + у), примет вид <appiy> <times/> <apply> <plus/> <ci>f</ci> <ci>g</ci> </apply> <apply> <plus/> <ci>x</ci> <ci>y</ci> </apply> </apply> Заметим, что внешне выражения в последних двух примерах выглядят одинаково, поэтому они одинаково записываются с помощью презентационного MathML, однако запись с помощью содержательного MathML позволяет их отличить. Этот пример показывает, что содержательный MathML более информативен: в нем есть средства описания смысла формулы, а не только ее внешнего вида. Элемент interval предназначен для представления интервала вещественных чисел. Его атрибут closure может принимать значения open, closed, open-closed или closed-open в зависимости от того, содержит ли интервал свои концы. Например, интервал [0, 1) записывается следующим образом: <interval closure="closed-open"> <cn>0</cn> <cn>l</cn> </interval> Этот элемент может быть использован, например, при описании интеграла от функции sinx по отрезку [0,7г]: <apply> <int/> <bvar><ci>x</cix/bvar>
<interval> <cn>0</cn> <pi/> </interval> <apply> <sin/> <ci>x</ci> </apply> </apply> Элемент lambda используется для построения функций, определенных пользователем. Например, функцию sin(x + 1) можно определить так: <lambda> <bvarxci> x </ci></bvar> <apply> <sin/> <apply> <plus/> <ci> x <cn> 1 </apply> </apply> </lambda> </ci> </cn> Последний элемент, входящий в lambda, определяет саму функцию от переменной, задаваемой элементом bvar. Элемент declare используется для указания того, что данный идентификатор обозначает математический объект с некоторым свойством или значением. Он аналогичен объявлению переменных в языках программирования. Элемент declare является специальным конструктором, так как его предназначение — определять семантику других элементов. Необходимость этого элемента математикам понятна. Одни и те же символы, например, а и 6, могут обозначать числа или элементы некоммутативной группы. В зависимости от этого операция произведения будет обладать разными свойствами. Поэтому для обработки математического текста необходимо знать типы объектов, входящих в выражения. Элемент declare имеет один или два вложенных элемента. Первый вложенный элемент обязателен и определяет объект, к которому применяется объявление. Например, <declare type="vector"> <ci> V </ci> </declare>
Покажем, как объявить, что идентификатор А обозначает вектор в трехмерном пространстве, и ввести обозначения его координат: <declare> <ci> A </ci> <vector> <ci> a <ci> b <ci> с </ci> </ci> </ci> </vector> </declare> Это объявление говорит о том, что идентификатор А обозначает вектор с координатами а, Ь, с. Заметим, что тот факт, что А есть вектор, может никак не сказываться на его визуальном отображении, однако может использоваться программами, обрабатывающими соответствующий MathML-документ. Другой пример использования элемента declare. <dec </de lare> <ci>x</ci> <cn>13 clare> 84</cn> Здесь объявлено, что х обозначает число 13.84. Токены и конструкторы называют также контейнерами, так как элементы этих типов содержат элементы, представляющие математические объекты. Элементы операторов и функций. Эти элементы можно разбить на следующие категории: Унарные, арифметика Унарные, логика Унарные функциональные Унарные, элементарные функции Унарные, линейная алгебра factorial, minus, abs, conjugate, arg, real, imaginary, floor, ceiling Not inverse, ident, domain, codomain, image sin, cos, tan, sec, esc, cot, sinh, cosh, tanh, sech, csch, coth, arcsin, arccos, arctan, arccosh, arccot, arccoth, arccsc, arccsch, arcsec, arcsech, arcsinh, arctanh, exp. In, log determinant, transpose
Унарные, векторный анализ Унарные, теория множеств Бинарные, арифметика Бинарные, логика Бинарные, теория множеств Бинарные, линейная алгебра TV-арные, арифметика TV-арные, статистика TV-арные, логика TV-арные, линейная алгебра TV-арные, теория множеств TV-арные, функциональные Интеграл, сумма, произведение Дифференциал, частная производная Кванторы divergence, grad, curl, laplacian card quotient, divide, minus, power, rem implies, equivalent, approx setdiff vectorproduct, scalarproduct, outerproduct plus, times, max, min, gcd, 1cm mean, sdev, variance, median, mode and, or, xor selector union, intersect, cartesianproduct fn(исключен из версии 2.0), compose int, sum, product diff, partialdiff forall, exists Большая часть этих элементов является пустой, они непосредственно представляют одноименные функции, например, <sin/>, <plus/>, <ехр/>. Приведем примеры. Следующий код задает вещественное число sin5: <apply> <sin/> <cn>5</cn> </apply> А вот так в содержательном MathML описывается функция, равная сумме функций sin и cos: <apply> <plus/xsin/><cos/> </apply>
Наконец, запишем тождество 1п(ех) = х: <appiy> <eq/> <apply> <1п/> <apply> <ехр/> <ci>x</ci> </apply> </apply> <ci>x</ci> </apply> Квалификаторы. В следующей таблице представлены квалифика торы и операторы, которые могут иметь квалификаторы: Квалификаторы Операторы JV-арные операторы Операторы, определенные пользователем lowlimit, uplimit, bvar, degree, logbase, interval, condition, domainofapplication, momentabout int, sum, product, root, diff, partialdiff, limit, log, moment, forall, exists plus, times, max, min, gcd, 1cm, mean, sdev, variance, median, mode, and, or, xor, union, intersect,cartesianproduct, compose, eq, leq, It, geq, gt csymbol, ci Квалификаторы всегда идут за оператором и предшествуют аргу ментам. Если оператор допускает несколько квалификаторов, то ohi идут в следующем порядке: bvar, lowlimit, uplimit, interval condition, domainofapplication, degree, momentabout, logbase Например, интеграл от функции х2 по отрезку [0, 1] записываете! следующим образом: <appiy> <int/> <bvar><ci>x</cix/bvar> <lowlimitxcn>0</cn></lowlimit> <uplimit><cn>l</cn></uplimit> <applyxpower/Xci>x</ci><cn>2</cnx/apply> </apply> Приведем еще пример использования квалификатора condition н; примере интеграла по некоторому множеству С:
<apply> <int/> <bvar><ci>x</cix/bvar> <condition> <apply><in/xci>x</ci><ci </condition> type= <apply><sin/xci>x</cix/apply> </apply> "set '>C</ciX/apply> Константы и символы. В содержательном MathML предопределены следующие элементы, соответствующие знаменитым константам, а также стандартным числовым множествам: Элементы Pi exponentiale imaginaryi notanumber true false emptyset eulergamma infinity integers reals rationals naturalnumbers complexes primes Стандартные обозначения 7Г e i NaN true False 0 7 oo Z R Q N С P Значение Отношение длины окружности к ее диаметру Основание натурального логарифма Мнимая единица Не число Истина Ложь Пустое множество Константа Эйлера бесконечность Множество целых чисел Множество вещественных чисел Множество рациональных чисел Множество натуральных чисел Множество комплексных чисел Множество простых чисел Элементы семантического преобразования. Пожалуй, это наиболее интересные элементы содержательного MathML, поскольку для них нет аналогов в презентационном MathML. Всего имеется три таких элемента: semantics, annotation, annotation-xml. Они предназначены для дополнительной информации, такой, как комментарии или аннота-
ции, относящейся к фрагменту содержательного MathML. В частности, можно указать, как данное выражение записывается в нотации Т^Х: <semantics> <apply> <plus/> <apply><sin/> <ci> x </ci> </apply> <cn> 5 </cn> </apply> <!—указано, как записать <annotation encoding=" \sin x + 5 </annotation> </semantics> эту формулу в TeX"> разметке TeX: —> Элемент semantics является контейнером, который предназначен для дополнительной информации о фрагментах текста, записанного в нотации содержательного MathML. Первый элемент, содержащийся в элементе semantics, — это выражение, к которому относятся комментарии, а остальные элементы содержат комментарии. Никаких ограничений на тип комментариев нет, это может быть альтернативная запись выражения в нотации Т^Х или какого-нибудь языка программирования для символьных вычислений или же просто определение математических объектов, входящих в выражение, или дополнительная информация об этом выражении. Атрибут definitionURL может использоваться для указания источника дополнительной информации о выражении. Информация, записанная в формате XML, должна содержаться в элементе annotation-xml, а информация в виде символьных данных включается в элемент annotation. Обработка всей этой дополнительной информации никак не регламентируется и полностью зависит от приложения, работающего с MathML-документом. Следующий пример дает представление об использовании элементов семантического преобразования: Oemantics definitionURL="www.emis.de/myfunction.html"> <!-- атрибут definitionURL содержит ссылку на файл с дополнительной информацией об этой функции —> <apply> <plus/> <apply> <sin/> <ci> x </ci> </apply> <cn> 5 </cn> </apply> <1— это же выражение записано в йотации языка программы Maple —>
<annotation encoding="Maple"> sin(x) + 5 </annotation> <!— это же выражение записано в презентационном MathML. Используется элемент annotation-xml —> <annotation-xml encoding="MathML-Presentation"> <math> <mo>sin</mo> <mrow><mo>(</moxmi>x</mi><mo>)</mo></mrow> <mo>+</mo> <mn>5</mn> </math> </annotation-xml> <!-- это же выражение записано в нотации языка программы Mathematica —> <annotation encoding="Mathematical Sin[x] + 5 </annotation> <annotation encoding="TeX"> \sin x + 5 </annotation> </semantics> Для продвинутого читателя. Разметка MathML смешанного типа. Презентационный MathML и содержательный MathML взаимно дополняют друг друга, каждый тип разметки несет свою информацию о математическом тексте, о том, как этот текст выглядит и каков его смысл. Но в MathML мы можем использовать так называемую комбинированную разметку, которая включает и презентационный, и содержательный MathML. Подробную информацию об этой разметке можно найти в гл.5 спецификации MathML 2.0 [3], мы же ограничимся тем, что приведем один пример, когда содержательная разметка включена в презентационную: <math> <mrow> <!-- в презентационной разметке элемент sup, и просто индекс. было бы неясно, мы бы использовали что такое 2 - Использование содержательной позволяет точно указать, что 2 > <apply> <power/> <ci>x</ci> <cn>2</cn> </apply> </mrow> </math> - это степень степень разметки или переменной х
6. ИНСТРУМЕНТЫ ДЛЯ РАБОТЫ С MATH ML В этой главе мы рассмотрим создание MathML-файла, содержащего один и тот же математический текст, с помощью различных программных средств различных редакторах. В качестве примера возьмем следующий текст, подготовленный с помощью издательской системы 1АТЕХ: Файл 6 0 1.tex \documentclass[12pt]{amsart} \usepackage[russian]{babel} \usepackage[utf8]{inputenc} \begin{document} Nsection^opMyna Ньютона - Лейбница} Пусть $f(x)$ дифференцируемая функция, определенная на отрезке $(а,Ь)$. Тогда $$ \intAb_a \frac{d}{dt}f(t)\,dt = f(b)-f(a). $$ Например, если $f(x)=\sqrt{x}$, то $\intA2_l \frac{l}{2\sqrt{x}}dx = \sqrt{2}-l$. \end{document} После компиляции этого файла получим файл 6_0_1.dvi, который можно просмотреть программами yap или xdvi (рис. 6.1). 1. Формула Ньютона-Лейбница Пусть }(х) — дифференцируемая функция, определенная на отрезке (а, Ь). Тогда Г *J a Af(t)dt f(b) /(e) at На пример, если /(.г) - \/х, то Г"—i^dx-- \/2 1. ' 2 vr Рис. 6.1. Просмотр файла 6_0_1.dvi Все рассматриваемые нами программные средства работают под ОС Windows, Linux, MacOS, но мы проверили их работоспособность под управлением OpenSuse Linux 10.2 и 10.3. Не исключено, что при работе под другими ОС возникнут незначительные изменения.
6.1. Редакторы Math ML Amaya (amaya-9.54, версия Feb 14 2007, Linux). Amaya (http://www.w3.org/Amaya/) — это веб-редактор, т.е. программа, предназначенная для создания и редактирования документов непосредственно в сети. В ней предусмотрены возможности просмотра документов и их локального и удаленного редактирования. Работа над этой программой была начата консорциумом W3C в 1996 г. с целью продемонстрировать, что инструменты создания веб-документов, использующие различные веб-технологии, можно организовать в одном окружении веб-клиента. Вначале Amaya был редактором HTML + CSS, но потом была добавлена поддержка XML и различных форматов, основанных на XML, в частности, MathML. Мы не будем описывать все возможности этого программного продукта и остановимся лишь на том, как применить его к созданию и редактированию текстов в формате MathML. На странице http://www.w3.org/Amaya/User/BinDist.html можно найти дистрибутив Amaya для операционных систем Windows NT/2000/XP/Vista, для основных дистрибутивов Linux и MacOS. Также доступны исходные коды программы. Процедура установки программы описана на той же странице. Создание MathML-документа (см. рисунки 6.2 и 6.3) После запуска программы в меню File нужно выбрать пункт «New» и далее «XHTML document». В открывшемся диалоге надо выбрать кодировку utf-8 (мы будем писать по-русски), тип документа XHTML I Е1-* E<11 xHJtA jMi Le*i ¥*"i 5V* ABnawtions Caopttatin b*<p Welcome to Amaya 9.54 Amaya в в Web cient that acts both as a browser and as an authonrg tool. It has boon designed by wx and innift w№ the primary purpose o< oornorelrafing new Web lochnotogjes and famine users to generate vakl Web pages. | with Amaya you can manputats nch Web pages cortaicwg terms. labtes. and the most aoVarced features Iran XHTML You can /ae\ create am ectt complex marhwnaJk-ai «pit-won* wntrm Web pages. You can style your rjocumenB usra Cascadra Style ^" Sheets{CSS} ! Doi.vi-4!:.r.i!i(Ait»#*.'*j''<.'d(l"4.Wt..it4!W*e-.(*v..'. m a tcr*/ в tw*y увгил ш Рис. 6.2. Запуск программы Атауа
Directory |/fiome/prince/MY/MYPAPERS/2007/MATHML_BOOl|[ ft> | |/home/prince/MY/MYPAPERS/2007/M^THML_BOOK/Nej - J ggr Title: ; felbnltzformulaNewton-Leibniz ® In new tab „ :—я ! Document profile: О In new Window ■ |XHTML1.1 |" | Charset j utf-8 i \ [ Open ^Онистить |Х01мена| Рис. 6.3. Открывшийся диалог программы Amaya (один из вариантов) и ввести заглавие страницы. В результате будет создан html-файл. Для работы с MathML-документами лучше сразу открыть панели инструментов (меню «ViewsShow tools» или F8). (!) Совет. Растяните панель инструментов на треть экрана, иначе часть кнопок окажется вне зоны видимости. Окно редактора будет выглядеть приблизительно так, как показано на рис. 6.4. Etfl XHJKIL XML Unfcs yews Style Annotations Cooperation t№ > 0 KJ О ,i ** 4 €^ l^m^nceWYJM¥P№ERSB0Q7^THML_BOOWNewllt^ Tools О Files Ь ScdOtijutti »btn bcdrom & Desktop Ь Documents №lash bGNUsmp ISKCJTS ЭВЕВШШШ X J^welc«netoAirev..] JdsaFOSAJjHNwiwn-i.eto№... Ш Рис. 6.4. Окно редактора Amaya Теперь наберем текст «Формула Ньютона-Лейбница», выделим его и нажмем Ctrl+h Ctrl+1 или выберем соответствующий пункт меню
«XHTML Headinghl». Далее наберем «Пусть», и теперь надо вставить формулу. Для этого нажмем на кнопку «Maths» на панели инструментов, открытой слева, и далее на кнопку «квадратный корень», расположенную в левом верхнем углу соответствующей панели (или выберем пункт меню «XML—»MNew formula», или нажмем Ctrl+m Ctrl+m). На экране возникнет затененный прямоугольник красного цвета, который показывает границы формулы. В этом прямоугольнике наберем f(x), а чтобы окончить набор формулы, достаточно два раза нажать правую стрелку. Шрифт формулы на экране автоматически изменится на курсив. Теперь продолжим набирать текст и, перейдя на новую строчку, вновь откроем формулу. В панели «Maths» перейдем на закладку 5, где найдем все необходимое для набора этой формулы. Набор формулы осуществим подобно любому WYSIWYG-редактору, например, Microsoft Equation. Отметим, что для набора простых математических формул можно пользоваться и меню «XML—» Basic Elements», «XML—»Constructions», «XML—» Matrices». В формуле получатся непомерно большие скобки, но это есть недостаток рендеринга браузера Amaya. В остальных браузерах (см. ниже рисунки6.5 и 6.6) формула будет выглядеть нормально. Рис. 6.5. Просмотр формулы в браузере Теперь нужно отцентрировать формулу, но на панели инструментов для этого нет средств. Тогда мы откроем исходный текст ViewsShow source (Ctrl+u Ctrl+o), и окно браузера будет выглядеть так, как показано на рис. 6.6.
E'te Edit XHXML УА IMS Views 3yle -адпоийоте Ceoperaoon ие)р • @ м о а Tools «<. ^lrfvxne^nCe*^*^PAPERS/2007*M71-l!A„BOOKJNewWm( у ■ J Welcome to Атзу..! ■INewtwiLeibfitiX. Jd ililiiii'L'L... рЗВЙЁШ® seas ii®iHiisyiaaei aeas &iB3igg|i«l D Special tfiaiadef* О xml Element type ham/boOyfp/mattfmrcMrimo/ Формула Ньютона-Лейбница Пусть fix) - дифференцируемая функция, определенная ни отрезке (л.А).Тогди шш <!Г.О> (</ГО> Рис. 6.6. Просмотр исходного текста Перейдем в окно с исходным кодом и добавим к соответствующему тегу <р> атрибут центрирования: получится <р center=" align">. Eile £dn xhtml XML Links yews £ryie .Annotations Cooperation Help '^0iiO 41, ф |/twme^fKeWV/MyBAPEBS/3007ff/ATV!ML_BOOK/amava_i ПЗ- [Jiang [bye (IMt о Mams TbiiiLi!!i5.L.„„„, dgSHkiiMisi ®!мЫЯй!_ ! sagayijJSi t3i3Lfj33@® I :л)Э1г) ! D special characters о хм. Element type Jr j ЦжекптеюАгоэу.., J Newton-Leibmi , | Формула Ньютона-Лейбница \ Пусть fix) - дифференцируемая функция, опрелсленная на отрезке (a\0). Тогда Например. <ханЛ\)=!/х , ю />■ д-и <шп>2- rasqrt> __|г .Document saved iTiome^ixeiWVJ\*^APERSQC»7ff^T><ML_BOOK/afT.aYa„1 Рис. 6.7. Центрирование набранной формулы
Щелкнув мышкой на окне набора, убедимся, что формула центрирована. Далее продолжим набор, причем здесь удобно пользоваться горячими клавишами, вызывающими соответствующие пункты меню для базовых математических элементов, например, «квадратный корень» — Ctrl+m Ctrl+r. Требуется некоторое время, чтобы привыкнуть к набору в этом редакторе, однако в основном все получается достаточно легко. Отметим, что исходный текст в нижнем окне изменится только после сохранения. Получим вид, представленный на рис. 6.7. При этом получится MathML-документ, который назовем 6 1 1 и сохраним его с расширением .xml или .xhtml, так как с расширением .html он не будет правильно интерпретироваться браузером. Файл 6 1 1.xhtml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="pmathml.xsl"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>Newton-Leibnitz formula</title> <meta name-"generator" content="Amaya 9.54, see http://www.w3.org/Amaya/" /> </head> <body> <Ы>Формула Ньютона - Лейбница</Ь1> <р>Пусть <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>f</mi> <mo>(</mo> <mi>x</mi> <mo>)</mo> </math> - дифференцируемая функция, определенная на отрезке <math xmlns="http://www.w3.org/1998/Math/MathML"> <mo> (</mo> <mi>a</mi> <mo>,</mo> <mi>b</mi> <mo>)</mo> </math>. Тогда</р> <p align="center"> <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> <msubsup> <mo>&Integral;</mo> <mi>a</mi> <mi>b</mi> </msubsup> <mfrac> <mrow> <mo>d</mo> <mrow>
<mi></mi> </mrow> </mrow> <mrow> <mo>d</mo> <mi>t</mi> </mrow> </mfrac> <mi>f</mi> <mo>(</mo> <mi>t</mi> <mo>) </mo> <mi>dt</mi> <mo>=</mo> <mi>f</mi> <mo>(</mo> <mi>b</mi> <mo>)</mo> <mo>&Integral;</mo> <mi>f</mi> <mo>(</mo> <mi>a</mi> <mo>)</mo> </mrow> </mathx/p> <px/p> <р>Например, если <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>f</mi> <mo>(</mo> <mi>x</mi> <mo>)</mo> <mo>=</mo> <mroot> <mi>x</mi> <mix/mi> </mroot> </math>, то <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> <msubsup> <mo>&Integral;</mo> <mn>K/mn> <mn>2</mn> </msubsup> <mfrac> <mn>K/mn> <mrow> <mn>2</mn> <msqrt> <mi>x</mi> </msqrt> </mrow> </mfrac> <mi>dx</mi> <mo>=</mo>
<msqrt> <mn>2</mn> </msqrt> <mo>&Integral;</mo> <mn>K/mn> </mrow> </math>.</p> </body> </html> Браузер Firefox 2.0 отображает файл 6 1 1.xhtml так, как показано на рис. 6.8). Файл Правка Вид И£урнал Закладки Цетрунекгы Справка ф - ф • © 4$ & j О jprt'ltyji^c^MfPN^ Формула Ньютона-Лейбница Пусть /{г) - днфффматргш** фумщм, «здывмм ю orp*txt (я. *) Тогда Рис. 6.8. Отображение файла 6 1 1 .xhtml браузером Firefox 2.0 Файл, полученный таким способом, адаптирован для просмотра с помощью IE (см. раздел 3.2), но браузер Mozilla 1.7.11 не отображает этот файл и выдает сообщение об ошибке «ошибка загрузки стилей». Поэтому нужно поправить исходный текст, убрав строку <?xml-stylesheet type="text/xsl" href="pmathml.xsl"?>, тогда Mozilla правильно отобразит данный текст (рис. 6.9). Интересно, что Firefox 2.0 правильно отобразит оба MathML-документа. I £айп Правка Вид- Пдовм Звпмрп &ктруимоы £м> Еприка . Формула Ньютона-Лейбница П>1:1ь/(д)-пифферен1аФувмаяфума*ас1гтределешэямао1ряке(в.Ь) Тогда напркмер.еспи/ijj-i/i.io Г-4-d<» i/5-l Рис. 6.9. Отображение файла 6 1 1.xhtml браузером Mozilla 1.7.11 В целом складывается ощущение, что веб-редактор Amaya хорош для набора небольших текстов, содержащих несложные математические формулы. Также его можно применять для правки MathML-текстов, созданных другими программными средствами. ■ШКШ
6.2. Open Office Текстовый редактор Open Office Writer, входящий в пакет Open Office, позволяет вставлять в текст математические формулы, подготовленные с помощью редактора формул, входящего в тот же пакет. Для этого надо вставить объект «Формула» (пункт меню: «Вставка—»Объект—»Формула»). Набор в редакторе формул несколько отличается от набора в Microsoft Equation: открываются панель, позволяющая выбрать различные элементы формул, и текстовое окно, где необходимо набирать TgX-подобный текст (рис. 6.10). Рис. 6.10. Набор формул в редакторе Open Office Writer При нажатии на кнопки в текстовом окне появляются шаблоны формул, например, при нажатии кнопки а/Ь появляется шаблон «<?> over <?>», в котором вместо <?> надо записать числитель и знаменатель дроби. Такой способ достаточно прост для набора, особенно для пользователей, знакомых с системой TgX. Полученный текст можно экспортировать в формат HTML, однако при этом формулы будут отображаться картинками. Экспорт в формат XHTML тоже ничего не дает. Однако, если навести указатель мыши на формулу и нажать правую кнопку, то появится меню, в котором есть пункт «Сохранить копию как». При выборе этого пункта открывается
диалоговое окно, где надо выбрать тип файла MathML. Будет создан файл с расширением .mml, содержащий разметку, адаптированную для IE+MathPlayer. Тем не менее, Firefox 2.0 и Mozilla 1.7.11 правильно отображают этот файл без всякого плагина, если последний сохранен с расширением .xml. Например, формула (в нотации редактора формул OpenOffice) intAb_a {d over dt} f(t) dt = f(b) - f(a) дает следующий текст: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE math:math PUBLIC "-//OpenOffice.0rg//DTD Modified W3C MathML 1.01//EN" "math.dtd"> <math:math xmlns:math="http://www.w3.org/1998/Math/MathML11> <math:semantics> <math:mrow> <mat-h:mrow> <math:msubsup> <math:mo math:stretchy="false">&Integral;</math:mo> <math:mi>a</math:mi> <math:mi>b</math:mi> </math:msubsup> <math:mfrac> <math:mi>d</math:mi> <math:mi math:fontstyle="italic">dt</math:mi> </math:mfrac> </math:mrow> <math:mi>f</math:mi> <math:mrow> <math:mo math:stretchy="false">(</math:mo> <math:mi>t</math:mi> <math:mo math:stretchy="false">)</math:mo> </math:mrow> <math:mrow> <math:mi math: fontstyle="italic11>dt</math:mi> <math:mo math:stretchy="false">=</math:mo> <math:mi>f</math:mi> </math:mrow> <math:mrow> <math:mrow> <math:mo math:stretchy="false">(</math:mo> <math:mi>b</math:mi> <math:mo math:stretchy="false">)</math:mo> </math:mrow> <math:mo math: stretchy="false">&Integral; </math:mo> <math:mi>f</math:mi> </math:mrow> <math:mrow> <math:mo math:stretchy="false">(</math:mo> <math:mi>a</math:mi> <math:mo math:stretchy="false">)</math:mo> </math:mrow> </math:mrow>
<math:annotation math:encoding="StarMath 5.0"> int*b_a {d over dt) f(t) dt = f(b) - f(a) </math:annotation> </math:semantics> </math:math> Таким образом, с помощью OpenOffice можно конвертировать формулы в MathML, а потом вставлять их в xml- или xhtml-файл, подготовленный с помощью того же редактора Open Office Writer. Однако это трудоемкий процесс, проводить который имеет смысл только при небольшом количестве формул. Итак, мы можем подготавливать математические тексты с простыми формулами, например, задания для школьников или студентов, с помощью WYSIWYG-редакторов, и публиковать их в сети. 6.3. TeXmacs GNU TeXmacs (http://www.texmacs.org/tmweb/home/welcome.en. html) — это свободно распространяемая программная среда, специально предназначенная для обработки научных текстов. Она включает WYSIWYG-редактор с поддержкой математических формул и редактор изображений. TeXmacs также может быть использован как front-end (интерфейс) для пакетов программ компьютерной алгебры, численных методов, статистики и т. п. Как и все серьезные научные программные продукты, среда Texmacs является кросс-платформенной, то есть может работать под управлением Windows, Linux и MacOS. Мы опишем Texmacs (1.0.6.9) под управлением SUSE 10.3 (пакет включен в дистрибутив). Texmacs имеет собственный формат файлов, которые экспортируются в различные форматы, включая MathML. Процесс набора математических текстов в программной среде TeXmacs поистине впечатляет и, наверное, является идеальным для любителей принципа WYSIWYG. Здесь мы не будем подробно описывать работу в TeXmacs, а лишь покажем, как с его помощью решить нашу задачу: набрать простой текст в MathML. Для того чтобы получить искомый текст в MathML, запустив Texmacs, выберем пункт меню «Файл —> Новый». Так как мы собираемся набирать на русском языке, выберем «Редактировать—> —> Предпочтения—>Язык—» Русский». Далее начнем набор, причем операции форматирования осуществляются интуитивно понятным образом с помощью кнопок на панели (советуем читателю познакомиться с этими кнопками внимательнее — там довольно много интересного). Переход к набору формул определяется вводом знака $, при этом сам знак не печатается, а на экран сразу выводится формула в «скомпилированном» виде. Переход к набору обычного текста происходит после
повторного ввода $. Когда мы находимся в режиме ввода математического текста, верхняя панель изменяется и на ней появляются кнопки для различных математических символов (рис. 6.11). &&&@©1[ша#РИ*?а1Ю$Р SSVSNaR! [.Файл Редактировать Вставить Текст Формат Документ Внд Ида Инструменты Помощь Новый H-F2 Загрузить... F2 Сохранить РЗ Сохранить как... S-P3 Обратить C-F2 Настройка страницы Печатать Импортировать Экспортировать Close document c-x k Закрыть TeXmacs C-x C-c общий текст русский 10 __ начало Рис. 6.11. Панель для набора математического текста Файл Редактировать Вставить Математика Формат Документ Внд Ида Инструменты Помощь gaHa»frxixi%iiaigm®©|Ei)a#DH#gi|o$p т i/T ^ +• *• : j S { I )®Ч->#р|аВС ? В И Формула Ньютон а-Лейбница Пусть /(х) — дифференцируемая функция, определенная на отрезке (а.Ь). Тогда /б"|-Д0<11=/(Ь)-/(о). общий мат гошап 10 цеитр мат f Рис. 6.12. Результат набора математического текста в Texmacs Файл Редактировать Вставать Текст формат Документ Вцд Иди Инструменты Помощь р'ана»вх[&1В1ё|&&&®©|е])»^ои»»я11Ф$» £ S = 5 5 S ¥11 != В ВI в s v S NX M {Формула Ньютона-Лейбница Пусть /(х) — дифференцируемая функция, определенная на отрезке (а.Ь). Тогда /k*jr/(0<»t=/(6)-/(«)• Например, если /(х) = у/ху то J" х ^-j=dx = у/2 — 1. Рис. 6.13. Результат набора математического текста в Texmacs Итак, мы получили результат, представленный на рис. 6.13. Теперь нужно экспортировать его в MathML.
По умолчанию экспорт в MathML не установлен, поэтому нужно выбрать пункт меню «Редактировать—> Предпочтения—» —> Преобразователи —> TeXmacs —» Html —»Use MathML». После этого можно осуществить экспорт, выбрав «Файл —> Экспортировать—»Html» и далее взяв расширение xhtml. Обратите внимание, что диалог с пользователем идет внизу экрана — в статусной строке — пользователям Emacs это привычно. Приведем здесь полученный файл б_3_1. xhtml. Файл 6_3_1.xhtml <?xml version="l.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN' "http://www.w3.org/TR/MathML2/dtd/xhtml-mathll-f.dtd"> <html xmlns:x="http://www.texmacs.org/2002/extensions" xmlns:m="http://www.w3.org/19 98/Math/MathML" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>No title</title> <meta name="generator" content="TeXmacs 1.0.6.9"></meta> <style type="text/css"> body { text-align: justify } h5 { display:inline; padding-right: lem } h6 { display: inline; padding-right: lem } table { border-collapse: collapse } td { padding: 0.2em; vertical-align: baseline } .subsup {display: inline; vertical-align: -0.2em } .subsup td { padding: Opx;text-align: left) .fraction { display: inline;vertical-align: -0.8em } .fraction td ( padding: Opx; text-align:center } .wide { position:relative; margin-left: -0.4em } .accent {position: relative; margin-left: -0.4em; top: -O.lem } .title-block{ width: 100%; text-align: center } .title-block p { margin:Opx } .compact-block p {margin-top: Opx; margin-bottom: Opx } .left-tab { text-align: left } .center-tab { text-align: center } .right-tab { float: right; position:relative; top: -lem } math { font-family: cmr, times, verdana } </style> </head> <body> <center> <P> <strong>&#x0424;S#x043E;S#x0440;S#x043C;S#x0443;S#x043B; S#x0430; S#x041D; S#x044C;S#x044E;S#x0442;S#x043E;&#x043D;S#x0430; &#x041B;S#x0435;S#x0439;S#x0431;S#x043D;S#x0438;S#x0446; S#x0430;</strong> </p> </center> <P> S#x041F;S#x0443;S#x0441;S#x0442;S#x044C; <math xmlns="http://wvTO.w3.org/1998/Math/MathML"><mrow>
<mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow> </mrow></math> <class style="font-family: Times New Roman"> Smdash;</class> <math xmlns="http://www.w3.org/1998/Math/MathML"> <mo>SApplyFunction;</mo> </math>S#x0434;S#x0438;&#x0444;S#x0444; S#x0435;&#x0440;S#x0435;&#x043D;&#x0446;S#x0438;&#x0440; &#x0443;&#x0435;S#x043C;&#x0430;S#x044F; S#x0444;S#x0443;S#x043D;S#x043A;S#x0446;S#x0438;&#x044F;, S#x043E;S#x043F;S#x0440;S#x0435;S#x0434;S#x0435;S#x043B; &#x0435;S#x043D;S#x043D;&#x0430;&#x044F; S#x043D;S#x0430; S#x043E;i#x0442;b#x0440;S#x0435;S#x0437;S#x043A;S#x0435; <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow><mo> (</mo><mi>a</miXmo>, </mo><mi>b</mi><mo>) </mox/mrow> </math>. S#x0422; S#x043E;S#x0433;S#x0434;S#x0430; </p> <center> <p> <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow></mrow> </math><math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow><msubsupxmo>SIntegral; </mo><mi>b</miXmrow><msub> <mrow></mrowxmrow></mrowx/msubxmi>a</mix/mrow> </msubsupXmfrac><mi>d</mi><mi>dt</miX/mf racxmi>f</mi> <mrow><mo> (</moXmi>t</mi><mo>) </moX/mrow><mo>&ApplyFunction; </moXmi>dt</mi><mo>SApplyFunction;</mo><mo>= </moXmo>SApplyFunction; </mo><mi>f</mi><mrowXmo>(</mo> <mi>b</mi><mo>)</moX/mrow><mo>&ApplyFunction;</mo><mo>- </moXmo>SApplyFunction; </mo><mi>f</mi><mrowXmo>(</mo> <mi>a</miXmo> ) </moX/mrowXmi> . </miX/mrowX/math> </p> </center> <p> S#x041D;S#x0430;S#x043F;&#x0440;&#x0438;S#x043C;S#x0435; &#x0440;,&#x0435;S#x0441;£#x043B;£#x0438; <math xmlns="http://www.w3.org/1998/Math/MathML"Xmrow> <mi>f</mi><mrowxmo> (</moXmi>x</miXmo>) </mo></mrow> <mo>=</moXmsqrtXmi>x</miX/msqrtX/mrowX/math>, S#x0442;S#x043E; <math xmlns="http://www.w3.org/1998/Math/MathML"Xmrow> <msubsupxmo>slntegral;</moxmn>l</mn><mn>2</mn> </msubsup><mo>SApplyFunction;</moxmfracxmn>l</mn> <mrow><mn>2</mn><msqrt><mi>x</miX/msqrtX/mrow></mf rac> <mi>dx</miXmo>SApplyFunction;</moXmo>=</mo><mo>&ApplyFunction; </mo><mroot><mrow><mn>2</mn><mo>SApplyFunction; </moX/mrowxmrow></mrowX/mrootXmo>-</moXmn>l</mn> <mi>. </mix/mrow> </math> </p> </body> </html>
Обратите внимание, что интеграл в нижней строке получился не совсем удачным (рис. 6.14). £1Йл Прием Вид 2&рнап Закладки Инструмент Справка О ^ " "^ * © © & |В tTI«://^omttfrfttKC/MYfli4YPAPERSaOOT^ U,|;ltj JK3HGoogle \%\ DsuSELinux QEnttrtainmint QNbws &lntamtt Starch QRatiranca ©Map» and Dtocttaw ©Shoppie ©Ptopltami Campant» Формула Ныотона-Лсйбтщя Пусть f(x) — дифференцируемая: функция, определенная на отраям (а, Ь), Тогда Например, если f(x) = \Лс, то J —-=&x.= 'J2— I. Рис. 6.14. Визуализация файла 6 3 1.xhtml Непосредственное редактирование текстовых блоков на русском языке в MathML-файле затруднительно, поскольку кирилические символы представляются специальными символами HTML. Например, текст «Формула Ньютона-Лейбница» записывается как &#х0424; S#x043E; Ь#х0440; &#х043С; S#x0443; &#x043B; Ь#х0430; S#x041D;S#x044C;&#х044Е;S#x0442;S#x043E;S#x043D;S#x0430; &#x041B;S#x0435;&#x0439;S#x0431;S#x043D;&#x0438; &#x0446; &#x0430; 6.4. ITEX2MML — простой конвертор ltex2MML — это консольная утилита, которая преобразует текст, содержащий формулы в нотации WebTeX — Т£Х-подобного языка разметки, предназначенного для подготовки текстов для публикации в сети (см. http://stuff.mit.edu/afs/athena/software/webeq/currenthome/docs/ webtex/webtex.html) — в текст, содержащий формулы в MathML-нота- ции. При этом остальной текст не изменяется. WebTeX был разработан для Java-апплета WebEQ, который позволяет авторам достаточно просто включать математические выражения в веб-страницы. Так как этот апплет является коммерческим продуктом, мы не останавливаемся на нем, а читатель может узнать подробности по ссылке http://stuff.mit.edu/afs/athena/software/webeq/ currenthome/docs/welcome.html. Мы используем версию программы itex2MML 1.3.3 от 21.11.2007. Домашняя страница размещена по адресу http://golem.ph.utexas.edu/~ ~distler/blog/itex2MML.html, а список команд для IteX, которые во многом совпадают с командами AMSLaTeX, можно найти на странице http://golem.ph.utexas.edu/~distler/blog/itex2MMLcommands.html. Если эта программа установлена, то мы можем решить задачу подготовки к публикации математического текста следующим образом.
В любом текстовом редакторе наберем следующий текст: <?xml version="l.0"?> <!DOCTYPE html SYSTEM 'mathml.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http <body> <hl> Формула Ньютона Пусть $f( ://www.w3.org/1998/Math/MathML"> - Лейбница </hl> x)$ дифференцируемая функция, на отрезке $(a,b)$. ■? ■? \intAb a $$ Например, $\int"2_l </body> </html> Тогда \frac{d){dt}f(t)\,dt = если $f(x)= \frac{l}{2\ \sqrt{x)$, sqrt{x}}dx f(b)-f(a). TO = \sqrt{2} определенная -1$. Заметим, что мы вручную указали заголовок xml-документа и добавили стандартную ссылку на таблицу объявлений mathml.dtd, а затем ввели html-разметку. Сам конвертор будет использоваться только для перевода формул в нотации Т£Х в MathML, т.е. itex2MML обрабатывает текст, окруженный знаками $. При этом конвертор не делает различий между включенными в текст формулами ($...$) и выключенными формулами ($$..$$). Также он не ведет автоматическую нумерацию формул. Поэтому itex2MML лучше использовать для простых документов. В консоли операционной системы SUSE Linux командой ./itex2MML < itex.tex > itex.xml будет подготовлен xml-файл. Файл 6 4 1.xhtml <?xml version="l.0"?> <!DOCTYPE html SYSTEM "mathml.dtd"> <html xmlns="http://www.w3.org/19 99/xhtml" xmlns :math="http://www.w3.org/1998/Math/MathML"> <body> <hl> Формула Ньютона - Лейбница </hl> Пусть <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><mi>f</mi> <mo stretchy="false">(</mo><mi>x</mi> <mo stretchy="false">)</mo></math> дифференцируемая функция, определенная на отрезке <math xmlns='http://www.w3.org/19 98/Math/MathML' display='inline'><mo stretchy="false">(</mo> <mi>a</mi><mo>,</mo><mi>b</mi> <mo stretchy="false">)</mo></math>. Тогда <math xmlns='http://www.w3.org/1998/Math/MathML' display=' block' XmsubsupXmo>SIntegral; </mo> <mi>a</mi>
<mi>b</mix/msubsup> <mfrac><mi>d</mi><mi>dt</mi> </mfrac><mi>f</mi><mo stretchy="false">(</mo> <mi>t</mi><mo stretchy="false">)</mo> <mspace width="thinmathspace"X/mspaceXmi>dt</mi> <mo>=</mo><mi>f</mixmo stretchy="false">( </mo><mi>b</miXmo stretchy="false">)</mo><mo>Sminus;</mo> <mi>f</mi><mo stretchy="false">(</mo><mi>a</mi> <mo stretchy="false">)</mo><mo>.</mo> </math> Например, если <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><mi>f</miXmo stretchy="false"> (</mo><mi>x</mi> <mo stretchy="false">)</mo><mo>=</moXmsqrt> <mi>x</mix/msqrt> </math>, то <math xmlns='http://www.w3.org/1998/Math/MathML' display=' inline' XmsubsupXmo>&Integral; </mo> <mn>K/mn> <mn>2 </mnx/msubsup><mfrac> <mn>l</mn><mrow><mn>2 </mn><msqrt><mi>x</mix/msqrt> </mrowx/mf racxmi>dx</mi> <mo>=</moXmsqrtXmn>2 </rnnX/msqrtXmo>&minus; </mo><mn>l </mn></math>. </body> </html> Обратите внимание, что в MathML-файле используются сущности sintegral; и sminus;, поэтому необходимо применить объявление <!DOCTYPE html SYSTEM "mathml.dtd">, иначе браузер выдаст ошибку, что эти сущности не определены. Результат см. на рис. 6.15. Формула Ньютона-Лейбница Пусь /и)-— дифференцируемая функция, определенная на отрезке {п. й). Тогда например, ес.".и/и)и Jl, 10/j-L.j*.. v5- i Рис. 6.15. Результат визуализации файла 6_4_1.xhtml 6.5. Конвертор tex4ht Пакет tex4ht (http://www.cse.ohio-state.edu/ gurari/TeX4ht/), созданный профессором университета Огайо Итоном М. Гурари (Eitan М. Gurari), является полнофункциональным конвертором из TfX в различные веб-форматы. Мы рассмотрим только конвертацию ТрХ
в MathML Названный пакет включен во все основные дистрибутивы Linux. Также инсталлятор tex4ht для Windows, Linux и MacOS можно найти в сети, в частности, на странице http://www.cse.ohio-state.edu/~ ~gurari/TeX4ht/mn22.html. Пакет tex4ht можно скомпилировать и из исходных текстов, ссылка на которые находится на той же странице. Например, в дистрибутив SUSE пакет tex4ht не входит, но подробная инструкция по его компиляции и установке находится по адресу http://www.exstrom.com/journal/comp/tex4ht.html. Опишем работу с пакетом tex4ht для системы MikTeX. Для упрощения обозначений будем считать, что все программы установлены в стандартных каталогах на диске С:. Установка пакета TeX4ht предусматривает следующие действия: • скачать файл tex4ht.zip с указанного веб-адреса; • создать каталог Tex4ht; • распаковать файл tex4ht.zip в каталог Tex4ht; • все файлы из каталога tex4ht\texmf\tex\generic\tex4ht переместить в каталог C:\tex4ht\bin\win32; • в файле C:\tex4ht\texmf\tex4ht\base\win32\tex4ht.env строку tc:\path\tfm! заменить на строку tc:\texmf\fonts\tfm!; • осуществить проверку: если каталог C:\tex4ht\texmf\tex4ht\htfonts содержит подкаталог htfonts, то содержимое этого подкаталога надо переместить в C:\tex4ht\texmf\tex4ht\. После установки пакета конвертация Т^Х-файла осуществляется одной командой. Например, файл example.tex конвертируется в example.xml для просмотра браузером Mozilla с помощью команды mzlatex example.tex. В результате создается файл следующего вида. Файл б 5 l.xml <?xml version="l.О" encoding="iso-8859-5" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//RU' "http://www.w3.org/Math/DTD/mathml2/xhtml-mathll-f.dtd" > <?xml-stylesheet type="text/css" href="example.css"?> <html lang="ru" xmlns="http://www.w3.org/1999/xhtml"> <headxtitlex/title> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-5" /> <meta name="generator" content="TeX4ht(http://www.cse.ohio-state.edu/~gurari/TeX4ht/)"/:■ <meta name="originator" content="TeX4ht(http://www.cse.ohio-state.edu/~gurari/TeX4ht/)"/> <!-- xhtml,mozilla --> <meta name="src" content="example.tex" /> <meta name="date" content="2007-ll-29 15:42:00" /> <link rel="stylesheet" type="text/css" href="example.ess" /> </head> <body> <h3 class="sectionHead"> <span class="titlemark">l.</span>
<a id="xl-10001"X/a>&#x0424;S#x043E;S#x0440;S#x043C;S#x0443; S#x043B;S#x0430; S#x041D;S#x044C;S#x044E;S#x0442; &#x043E;S#x043D;S#x0430;&#x041B;S#x0435;S#x0439; &#x0431;&#x043D;S#x043B;&#x0446;S#x0430;</h3> <!--l. 8—><p class="noindent" >S#x041F;S#x0443;S#x0441;S#x0442;S#x044C; <!—1.8—> <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline" > <mi>f</mi><mrow > <mo class="MathClass-open"> (</mo><mrow><mi>x</mix/mrow> <mo class="MathClass-close">)</mo></mrow> </math>s#x00A0;S#x2014; &#x0434;S#x0438;S#xO444;S#x0444;&#x0435;&#x0440; S#x0435; S#x043D;&#x0446;S#x043B;S#x0440;&#x0443; S#x0435;S#x043C;S#x0430; &#x044F; S#x0444;S#x0443; S#x043D;&#x043A;S#x0446;S#x0438;S#x044F; , &#x043E;S#x043F;S#x0440;S#x0435;S#x0434; &#x0435; S#x043B;S#x0435;S#x043D;s#x043D;S#x0430;s#x044F; S#x043D;S#x0430; S#x043E;S#x0442;&#x0440;S#x0435;S#x0437; S#x043A;S#x0435; <!—1. 9—> <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline" > <mrow Xmo class="MathClass-open"> (</moXmrowXmi>a</mi> <mo class="MathClass-punc">,</mo><mi>b</ml> </mrow><mo class="MathClass-close">)</mo> </mrow></math>. S#x0422;S#x043E;S#x0433;&#x0434;S#x0430; <! —tex4ht: inline—X/pX ! —1. 10—> <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> <msubsup><mrowXmo class="MathClass-op">S#x222B; <!--nolimits—x/mo><!--nolimits--> </mrow><mrow><mi>a</mi></mrow> <mrow><mi>b</miX/mrowx/msubsup> <mfracxmrow><mi>d</miX/mrow> <mrow><mi>d</mi><mi>t</mix/mrow></mfrac> <mi>f</mi><mrow> <mo class="MathClass-open">(</mo><mrow> <mi>t</mix/mrow> <mo class="MathClass-close">)</mox/mrow> <mspace width="0em" class="thinspace"/> <mi>d</mixmi>t</mi> <mo class="MathClass-rel">=</mo> <mi>f</mi><mrow> <mo class="MathClass-open">(</mo><mrow><mi>b</mi></mrow> <mo class="MathClass-close">)</mo> </mrow> <mo class="MathClass-bin">S#x2212;</mo> <mi>f</mixmrow Xmo class="MathClass-open">(</mo> <mrow><mi>a</mix/mrow> <mo class="MathClass-close">)</mo> </mrow><mo class="MathClass-punc">.</mo> </math>
<!—1. 12—><p class="nopar" > S#x041D;S#x0430;S#x043F;S#x0440;S#x0438;S#x043C;S#x0435; S#x0440;, &#x0435;S#x0441;s#x043B;&#x043B; <!—1.13-- > <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline" > <mi>f</mi><mrow Xmo class="MathClass-open">(</mo> <mrow><mi>x</mi></mrow><mo class="MathClass-close">)</moX/mrow;- <mo class="MathClass-rel">=</mo> <msqrt><mrow> <mi>x</miX/mrowX/msqrtX/math>, S#x0442;S#x043E; <!—1. 14--> <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline" ><msubsup> <mrow> <mo class="MathClass-op"> S#x222B;<!—nolimits—></mo> <! --nolimits--x/mrowxmrowxran>l</mnx/mrow> <mrowXmn>2</mnX/mrowX/msubsup> <mfracXmrow><mn>l</mn></mrow> <mrow><mn>2</mn> <msqrtxmrow><mi>x</mi></mrowx/msqrtx/mrowx/mfrac> <mi>d</mixmi>x</mi> <mo class="MathClass-rel">=</mo> <msqrt><mrow><mn>2</mnx/mrowX/msqrt> <mo class="MathClass-bin">i#x2212;</mo> <mn>l</mn> </math>. </p> </body> </html> Отметим, что в данном файле используется файл таблицы стилей example.ess. Также обратим внимание на то, что русские буквы представляются специальными символами HTML и используется кодировка iso-8859-5. Если выполнить команду mzlatex example_l.tex "html, mathplayer" то будет создан файл example.xht, который просматривается через IE+MathPlayer. Отметим, что его также можно открыть браузером Firefox. Конвертор Tex4ht прекрасно конвертирует Т^Х-документы любого объема и сложности. Если полученный XML-файл содержит ошибки, то они, как правило, вызваны неправильными конструкциями в исходном ТиХ-файле. В основном такие ошибки связаны с расстановкой ограничителей, к которым компилятор Т£Х относится «толерантно» и исправляет их так, что на выходе они становятся незаметными. Например, фрагмент кода $f(x)=g(x$) не вызывает сообщений компилятора Tj=X об ошибке, однако приводит к сбою при конвертации — получается следующий MathML-код: <mi>f</mi> <mrow Xmo class="MathClass-open">(</mo>
<mrow><mi>x</mi></mrow> <mo class="MathClass-close">) </mo> </mrow> <mo class="MathClass-rel">=</mo> <mi>g</mi> <mrow ><mo class="MathClass-open">(</mo> <mrow><mi>x</mi>) в котором тег mrow оказывается не закрытым. Такие же проблемы могут возникать в многострочных выключенных формулах, например, \begi f (X) \\ гЛ2 ] \end{ n{multline} = \int [ хА2 du multline} + \dots будет воспринят спокойно компилятором Тг^Х, но на самом деле по правилам Tj:X этот абзац должен быть набран так: \begin f(x) = \\ \left. multline) \int z"2 ] \left[ du \end{multline} X 42 + \dots \right. Таким образом, любители изобретать собственные приемы набора (а это — отступление от признанной культуры подготовки текстов в TgX) могут столкнуться с проблемами. В любом случае можно рекомендовать после набора Тг^Х-файла воспользоваться программами типа chktex или lacheck для проверки, даже если вы не собираетесь конвертировать файл. Ошибок (в том числе и математических) в тексте станет меньше. 6.6. On-line конверторы в MathML В настоящее время в интернете представлен ряд конверторов в формат MathML, позволяющие произвести конвертацию в режиме оп-Ппе. Рассмотрим в качестве примера два из них. ASCIIMathML (http://wwwl.chapman.edu/~jipsen/asciimath.html) (рис. 6.16). Этот ресурс использует Java-скрипт ASCIIMathML.js (http://wwwl.chapman.edu/~jipsen/mathml/asciimath.html, автор скрипта — Питер Жипсен (Peter Jipsen)). Скрипт работает на компьютере пользователя и и запускается при загрузке демонстрационной страницы http://wwwl. chapman. edu/~ ~jipsen/mathml/asciimathdemo.html. Этот ресурс может использо-
», файл Правка Цид Переход Закладки Инструменты £кно ^правка (a, fcj- {i e R ASCII MaUjML Translating ASCII math notation to Presentation MathML ***1 (a. i] - {* e R ASCIIMathML. The page you are about to view requires Internet Explorer 6 + MathPlaver or Firefox 1.5/2.0+/Mozilla. Proceed to ASCIEMathML Home Page Preview Screenshot: If you are using Internet Explorer and have installed MathPlayer, or if you are using Netscape 7 (or equivalently Mozilla/Firefox) then you should see the following examples on the "real" ASCUMathML.js homepege: Let's test the ASCILMatbML.js translator on a simple example. Example: Solving the quadratic equation Supposes x~ - bx ~c = Q and a = 0. We first divide by a to get л* ■* -л + - = 0. Then we complete the sqi a a - b { b \2 ( b V с ( b V b- с obtain .v" ■*■ - л: -r —-1 - I — ■*■ - = 0. The first three terms factor to gh"e .v + — | = —- —. Now we take square roots on both sides and get a \2al \2al a \ 2a/ 4a- a ■■\Га -. Finally we move the — to the right and simplify to get the two solutions: x\ ; ~b= \ b~ - Aac Here is the text that was typed in: Example: Solving Che quadratic equation. Suppose "ax'2+bx+c-O" acd 'a!-0". He first divide by "a- co oet 'x"2*b/ax+c/a.-0'. Then we corcplece the square and obtain -х"2->-Ь/ах*<Ь/(2a))*2-(b/(2a))*2*c/a-0'. The first three tems facto: to give ' (х+Ь/ (2ej) "2-(b"2) / (4e~2) -с/л' . How we take square roots on both sides and gee "x-b/(2a)-*-sqEt((b"2)/[4a*2)-c/a)'. Finally we move the 'b/(2aj' to the right and simplify to act the two solutions: ■x_(l,2>- l-b—sqrt ib'2-Лйс)) I (2a) ' If yo« don't believe this, copy the text and paste it on the ASCIIMatfa.ML.is: Try itvoorself demo page. 1<1;^^Т?^^^Ж^ 'fa ЫЫ"Н!®*Я&Ж&\ на tag? о cat готово- i- -■-... ■ - ■ - -- ■■ - - « . ■ ■ .- . ■ ■ -акитП Рис. 6.16. On-line конвертор ASCIlMathML ваться локально: достаточно сохранить названную демонстрационную html-страницу. Непосредственная работа с этим ресурсом выглядит следующим образом: в окне для ввода набирается текст в Т^Х-подобной нотации (правила набора объяснены на той же демонстрационной странице и на странице http://wwwlxhapman.edu/~j4psen/mathml/asciimath.html). Для набора текста необходимо ввести в окне для ввода (обратите внимание, что знак Л используется вместо знака $). Формула Ньютона - Лейбница Пусть 1f(х)' - дифференцируемая на отрезке '(а,Ь) '. Тогда 4nt a Например, '\int_ ЛЬ frac{d}{dt} f(t) dt = если 'f(x)=\sqrt{x} \ то 1Л2 frac{l}(2 sqrt{x}}dx функция, определенная f(b) - f(a) * = sqrt{2} -r.
Результат вполне удовлетворителен (см. рис.6.17). Следует отметить, что конвертация осуществляется по мере набора текста, т. е. можно исправлять ошибки ввода непосредственно в процессе ввода. | Home Page I Syntax I Try it I Calculator I Download I Graphs I ASCIIMath FAQ I Sandbox I Comments I ASCIIMathML.js: Try it yourself (HTML version) This page requires Internet Explorer 6+MathPlaver or MozlllafHrefox/Netscape 7*. Edit the formulas below (the display updates dynamically). If you know (La)TeX formula syntax, you can try some of that as well (LaTeX formulas work best when enclosed in $-signs). The "amath" token switches on the new auto-math-recognize mode. Формула Нэютона-Лейбница Тусть 'fix)' - дифференцируемая функция, определенная на отрезке '(а,ЬГ. Тогда 'Intj-tJ JracWHjJt) fit) ttt = f(b) - *(«)' Например, если 'f(х)=У5чТШГ. то u '\tat_i"2| frsc{i><2 тШ}Ш = sattra г. Формула Ньютона-Лейбница Пусть f(x) - дифференцируемая функция, определенная на отрезке (з, 4). Тогда Г jf(t)dt = /(*)-До) Например, если/(х)= Л то J -^j=dx = v/2-1. Рис. 6.17. Результат ввода математического текста в ASCIIMathML Для того чтобы получить сам MathML-код, например, в браузерах Mozilla и Firefox, нужно в контекстном меню (открывается при нажатии правой кнопки мыши), выбрать «Просмотр исходного кода страницы». В нашем примере получится следующий код: <id="outputNode">Формула Ньютона-Лейбница Пусть <span style="font-size: lem; font-family:serif;"> <math title="f(x)"> <mstyle fontfamily="serif" displaystyle="true" mathcolor="blue"><mrow><mi>f</mi> <mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow> </mstyle> </math> </span> - дифференцируемая функция, определенная на отрезке <span style="font-size: lem; font-family:serif;"> <math title="(a,b)"> <mstyle fontfamily="serif" displaystyle="true" mathcolor="blue"> <mrowXmo>(</mo> <mi>a</mi><mo>,</mo><mi>b</mi><mo>)</mo></mrow> </mstyleX/mathx/span>. Тогда <span style="font-size: lem; font-family:serif;"> <math title="int_aAb frac{d}{dt} f(t) dt = f(b-f(a)">
<mstyle fontfamily="serif" displaystyle="true" mathcolor="blue"Xmrow><msubsup><mo>SIntegral;</mo> <mi>a</mi><mi>b</mi></msubsup></mrow> <mfracXmrowXmi>d</miX/mrow> <mrow><mrow><mi>d</mi><mi>t</mi></mrow></mrow></mfrac> <mrowXmi>f</miXmrowXmo>(</mo><mi>t</mi><mo>)</mo> </mrowX/mrowXmrowXmi>d</mi><mi>t</miX/mrow> <mo>=</moXmrowXmi>f</miXmrowXmo> (</mo><mi>b</mi><mo>)</mo> </mrowX/mrowXmo>-</moXmrowXmi>f</miXmrowXmo> (</mo><mi>a</mi><mo>)</moX/mrowX/mrow> </mstyleX/math> </span> Например, если <span style="font-size: lem;font-family: serif;"> <math title="f(x)=\sqrt{x}"> <mstyle fontfamily="serif" displaystyle="true" mathcolor="blue"> <mrowXmi>f</miXmrowXmo>(</mo><mi>x</mi><mo>)</mo> </mrow></mrow><mo>=</mo><msqrt><mrow><mi>x</miX/mrow> </msqrtx/mstyle></mathx/span>, то <span style="font-size: lem; font-family:serif;"> <math title="\int_lA2 frac{l}{2 sqrt{x}}dx =sqrt{2}-l"> <mstyle fontfamily="serif" displaystyle="true" mathcolor="blue"XmrowXmsubsupXmo>&Integral;</moXmn>l</mn> <mn>2</mnX/msubsupX/mrow> <mf racXmrowXmn>l</mnX/mrow> <mrow><mn>2</mn><msqrtXmrow><mi>x</miX/mrow></msqrt> </mrowX/mfracXmrowXmi>d</miXmi>x</miX/mrow> <mo>=</moXmsqrtXmrowXmn>2</mnX/mrowX/msqrt> <mo>-</mo><mn>l</mn></mstyle></mathx/span>.</div> Питер Жипсен предназначал свой скрипт для создания динамических xhtml-страниц и электронных писем и сообщений, содержащих формулы (см. http://math.chapman.edu/email/). Создадим xhtml-страницу, выводящую наш текст. Сначала скачаем файл ASCIIMathML.js — для этого достаточно сохранить страницу http://wwwl.chapman.edu/~jipsen/mathml/asciimath.html. Теперь создадим html-файл, содержащий следующий текст: <html> <head> <title>ASCIIMathML: Math on the web for everyone</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="text/javascript" src="ASCIIMathML.js"> </script> <body> <п2>Формула Ньютона - Лейбница</Ь2> <p> Пусть 'f(x)v - дифференцируемая функция, определенная на отрезке '(ajb)'. Тогда
<p> <p align=center> 'int_aAb frac{d}{dt} f(t) dt = f(b) - f(a) </p> <P> Например, если 'f(x)=sqrt{x}*, то 4nt_lA2 frac{l}{2 sqrt{x}}dx = sqrt{2}-l'. </p> </body> </html> и разместим полученный файл в одном каталоге с файлом ASCIIMathML.js. Результат отображения этого файла в браузере представлен на рис. 6.18. Файл Правка Цид Переход Закладки инструменты Qkho Справка (£jjL (й# Ч* S# 1V Pie /^оте/рмпсе/ЬГ//МУРАРЕЯ5/^^ | \Щ§йшВ$ ^Ь j© fi К началу ЁЗЗаклвдкн ^ mcr2ftfa.org *-* mozlflaZlne vmozdev.org — ■ шштгжгшяша ^ASCllMathMt. Mathontheweoftr.. |_ Формула Ньюгона-Лейбшща Пусть /(л) - дифференцируемая функция, определенная на отрезке (а, Ь). Тогда J jtf(f)di = №-№ Например, если Ял) - \*~х, то / —j= <1х = у"2- 1 Рис. 6.18. Результат отображения файла в браузере Отметим, что скрипт ASCIIMathML.js может иметь весьма широкое применение. Благодаря тому, что он работает на компьютере пользователя, он может быть использован в разнообразных программных средствах для отображения математических формул в браузере. Этот скрипт уже используется в системах Movable Type, WordPress, phpBB и всевозможных вики-энциклопедиях. Также имеется php-порт этого скрипта ASCIIMathPHP (подробности см. на странице http://www.oldschool.com.sg/index.php/module/Shared/action/Static/ tmpl/ASCIIMathPHP). 6.7. Применение веб-технологий: переносимая коллекция электронных математических документов С помощью веб-технологий, описанных в предыдущих разделах, несложно создать коллекцию математических электронных документов, которая может быть размещена на внешнем носителе (компакт- диске или флэш-накопителе), жестком диске персонального компьютера, сетевом диске или в интернете.
Потребуем, чтобы: • наша коллекция функционировала одинаково, независимо от размещения, способа доступа к ней и операционной системы (Linux, MacOS, Windows), установленной на компьютере; • перенос коллекции с одного носителя на другой осуществлялся простым копированием файлов и не требовал перенастройки; • коллекция была оснащена развитым сервисом, в частности, поиском по авторам, названиям, ключевым словам и т.д. Покажем, как сделать такую коллекцию, на примере компакт- диска, содержащего статьи журнала «Lobachevskii Journal of Mathematics» за 10 лет (http://ljm.ksu.ru, стартовая страница представлена на рис.6.19). Прежде всего, для управления коллекцией выберем программное обеспечение. Мы хотим, чтобы оно работало в любой операционной системе и устанавливалось на любые носители. Для этого лучше всего использовать программы, которые не потребуют инсталяции на компьютер пользователя. Далее, эти программы должны обеспечивать просмотр документов в стандартных форматах представления математических статей и, безусловно, в формате MathML. Тогда наш выбор очевиден — это браузер Firefox, так как он поддерживает MathML без установки дополнительных программ. Кроме того, в коллекции должен быть организован поиск. Для реализации поисковых функций можно использовать Javascript. Эта связка — Firefox + Javascript — решает Файл Правка Вид Журнал Закладки Инструменты Справка # v $2 & Г* ~ Г ^' !fb~"PyBookReader"4 © ■* ftNewev ELos Andesv BKazan»' CMatrw Йигшх"* SToolsv ETu,onalsv 9 ljm_admin |j*£Sage__home C1 v ! v ' ^ Поиск *■' !? Вверх v с Lobachevskii Journal of Mat Ф %:фт$$ф£Ш •"S^*-* ЯНН» »**\№ОИП»|1»1. ^7 Aulborlndci PajjeiJa^,, Search LJM: АММЯ ~р8^ ««ЙЦА Abitr.ei *МШш ffaft ; i^s & ^** ***%**-,. ^ ^-^*. ^^Ч^ * * * - л ( , * T1^|nteQt!ono^«^omBali^toi^tia|^eiEsifi'Ma|hemiidA4io^flrao^a)¥«j1's ^ * fc nnom«l[tfcreolnjproceis,o»enicaiby»oc<iiiori«l board r ^ r * - >»■« Cmitam ofLJM. Eslabllioed by Haitian Academy ofSciences and KaiaftStjle.Univerrtyff* •{*.. * .>. Sabmbilo» oflte article. - Ье8111отЛЛ1уВш»1я|^%«й^01т5}1»еот|Чю^1^»«А«°и 1ЭД& .sgV ч'ЛчдигаИо! of tt« article JSsp-J8l8-99tf! „ -5 ГТ^-ч» * . - \ ''V * .» ГОТОВО ЛОПе #t MO 0 t£. TongM IK ^ F 76 С Рис. 6.19. Входная страница коллекции статей журнала «Lobachevskii Journal of Mathematics»
поставленные задачи по организации коллекции со следующими свойствами: • выводит список ссылок на статьи, входящие в коллекцию; пройдя по ссылке, пользователь попадет на страницу статьи, содержащую реферат и ссылки на тексты статьи в форматах DVI, PS, PDF и MathML; • выводит список авторов статей, входящих в коллекцию; пройдя по ссылке, пользователь попадет на страницу, содержащую все статьи данного автора, включенные в коллекцию; • осуществляет поиск по авторам, заглавиям, ключевым словам, рефератам, тексту статей, математическим формулам; при поиске по тексту статей и по формулам выводится список ссылок на тексты статей в формате MathML, а в открывающихся MathML-документах текст, входящий в поисковый запрос, отмечается фоновым выделением (см. рисунки 6.20 и 6.21). При создании электронной коллекции следует учитывать, что, с одной стороны, браузер выполняет скрипты не слишком быстро, поэтому информацию надо организовать так, чтобы свести к минимуму ее обработку. С другой стороны, надо учитывать и время передачи файлов: если скорость передачи файлов невысокая (например, используется интернет с медленным каналом), то объем файлов не должен быть слишком большим. Мы приведем здесь вариант организации электронной коллекции, адаптированный для размещения на жестком Файл Правка Вид Журнал Закладки Инструменты Справка * v Ш & 6 |В1':" '■■■-■i.-r'=-"-'-^-,^'.u.v_'-'4"^,..'-'4At ■;»■•, .^ ■:- ~j (ftvPyBookReadar <\| ф ^ CJNewsv OLos Andesv QKazanv J^Mathw HLinux" USToolsv UTutorials" ®ljm_admin £gSage_home » (t v J _ ' ,,mi", , J v I I ^Поиск v ГЙВверх ^ уП-лд. ч ■!•--■ Рис. 6.20. Поиск по ключевым словам
Файл Правка Вид Журнал Закладки Инструменты Справка 4 Ф v 0 @ 6 |Bi{ile№noma.lwnce/MYUM.LJM_CDROM„FiNAL>liin'Voiii...:. v] |ftvjPyBookReader 4$ QNewsv ggLos Andes v ggKazanv- QMathv gLinuxv QTods^ В Tutorials v g)ljm_admin HSageJiome <f v |vj J ^Поиск v-, tJiteepx v ^Подсвет* [I)ffle:/Wiome^...word8=funcaon I + uuiiuitni oy о. iii ишшиинш тигитгтпнпвд uuiiuitni uy о. in at^usutnibb т«итттз7ттгвтршге10(ГОГ1Х1ПТВГГ1ПГОги"с The equations (3) are a generalization of Scheffers' conditions [33]. [34] for 4 -differentiability of a function f:UcA-+ A: «rA^-liV' (4) where ?£. are the stnjcture constants of A with respect to a basis [ea J. end afl/b = dfb/dx". Scheffers' conditions (4) can also be written in trie form [34]: For a function of several variables /: и с А" -» A , f: {x1 = xtae0} «■ /(*') = fb{xb,)eb • where A" = Ax-xa is the Л -module of л -tuples of elements of л , Scheffers' conditions of Л -differentiability are of the form «li^-ri^V. (6) If a function / satisfies the equations (6), its differential can be represented in the form df = f,dxl, where /, = s°dkf is the partial derivative with respect to the variable X1 e A .The functions fi(xJ),t= l я .are also A -differentiable. 3. Smooth Amotions over Iocs) Weil algebras A unital algebra A <= A is said to be local in the sensa of A.Weil [50], [54], [17] if its radical (the set of nilpotent elements) R od(A) = ■ a is a maximal ideal and the quotient algebra a/* a is isomorphic to r . The one-dimensional vector subspace in Готово j попв [#|но| © & | Tonighuiyc © | Fii:26*c Q Рис. 6.21. Поиск по тексту диске персонального компьютера, внешнем носителе или в локальной сети, т.е. предполагаем, что файлы передаются достаточно быстро и отсутствуют ограничения на объем передаваемых данных. Структура коллекции естественным образом разбивается на две части — хранилище статей и поисковую систему (рис. 6.22). Входная страница Хранилище статей Поисковая система Рис. 6.22. Структура коллекции Хранилище статей (рис. 6.23) представляет собой множество каталогов, в каждом из которых помещены HTML-файлы, содержащие информацию о статье (автор, название, выходные данные) и ссылки на файлы текста статьи в форматах DVI, PS, PDF, XHTML (в последнем хранится текст статьи в формате MATHML), и сами файлы текстов статей в указанных форматах. Хранилище снабжено списком авторов и списком статей со ссылками на соответствующие HTML-файлы.
paper list volume 1 paperl.ps paperl.pdf paperl.ps paperl.xml paper2.ps paper2.pdf paper2.ps paper2.xml paper_n.ps paper_p.pdf paper_n.ps paper_n.xml volume 2 Рис. 6.23. Принципиальная структура хранилища Пример HTML-файла с информацией о статье приведен в файле 6_7_1.html. На рис. 6.24 можно увидеть, как выглядит соответствующая страница при отображении в браузере. •fP. . -,'-- .\ -?"J~,' Ftfffifext Search > s„, < ч ,- MsWISfc ,ШМА|,^Ч««/ ^dptor' '^КЙГ f^^S yc8pTrt,M. VS-* * *" ** ^Search bJMi-^atlMira тае^КсттЩ^btiniti АаГ ^ *" . ,, ,..м 1 —<J—, .ti f. , bus—fr,i*,,fi. ,>,>{■ »^ji, ft.jfe*?,,.»^.* u r~ •- .< Л FullTexf Search s» *- ' <!' * , ■> ' «. *•■* ^ w,\j"*' *r** <w maps the un t disk Рис. 6.24. Вводим поисковый запрос: «maps the unit disk» Файл 6 7 1.html <!DOCTYPE <html> <head> HTML PUBLIC <META HTTP-EQUIV= charset=" lso-8859 "//W3C//DTD 'Content- -1"> -Type" HTML 4 CONTENT= 0//EN"> •text/html"
<link href^"../ess/article.ess" type-"text/css" rel="stylesheet"> </head> <body> <em> <h2 align="center"> <a href="../Authors/EBallico.html">E. Ballico</aX/h2> </em> <hl align="center"> Quivers, vector bundles and coverings of smooth curves </hl> <h2 align="center"> (<em>Lobachevskii Journal of Mathematics, <a href="../Volume_19/content.html">Volume XIX</a> </em>) </h2> <p><hrx/p> <p>Fix a finite quiver <i>Q</i> and consider quiver-bundles on smooth and connected projective curves. Let <i>f: X S#8594; Y</i> be a degree <i>m</i> morphism between such curves and <i>E</i> a quiver bundle on <i>Y</i>. We prove that <i>E</i> is semistable (resp. polystable) if and only if <i>f<SUP>s#8727;</SUPX/i>(<i>E</i>) is semistable. Then we construct many stable quiver-bundles on bielliptic curves. </p> <p>Snbsp;</p> <p>Snbsp;</p> <hr> <table class="AtricleTab" cellspacing="15" align="center"> <tbody> <tr> <tdxa href="./19_l.dvi">DVI format</td> <tdxa href="./19_l.ps">PostScript format</td> <td><a href="./19_l.pdf">PDF format</td> <td><a href="./19_1.xml">MathML Format</td> </tr> </tbody> </table> </body> </html> Поисковая система состоит из набора индексных файлов в формате XHTML. Индексный файл — это файл, содержащий соответствующую информацию о статьях. Например, индексный файл для поиска по ключевым словам содержит форму для поиска, ключевые слова всех статей со ссылками на соответствующие статьи и соответствующий скрипт для поиска. Приведем отрывок такого индексного файла. <AUTHORS>Yu. E. Hohlov, D. V. Prokhorov</AUTHORS> <PTITLE> On geometrical properties of free boundaries in the Hele-Shaw flows moving boundary problem
</PTITLE> <URI> Volume_l/1_1.html </URIXKEYWORDSX/KEYWORDS> <AUTHORS>Yu. F. Korobeinik</AUTHORS> <PTITLE>Absolutely convergent dirichlet series and analytic continuation of its sum </ PTITLEXURI>Volume_l /1_2 . html</URI> <KEYWORDSX/KEYWORDSXAUTHORS>Igor V. Konnov</AUTHORS> <PTITLE> Combined Relaxation Methods for Variational Inequality Problems over Product Sets </PTITLEXURI>Volume_2/2_l.html</URI> <KEYWORDS>Variational inequalities, product sets, decomposition scheme, combined relaxation methods</KEYWORDS> При обработке формы на странице поиска по ключевым словам скрипт проверяет содержимое элемента keywords на соответствие поисковому запросу и в случае успеха выводит содержимое элементов AUTHORS, ptitle и URI так, что на результирующей странице появляется ссылка на соответствующую статью. Для продвинутого читателя. Приведем отрывок из индексного файла для поиска ключевых слов. <HTML> <HEAD> <!— здесь стандартные метаданные . —> <SCRIPT LANGUAGE="JavaScript" SRC="include_js/gup.js"> </SCRIPT> <!— gup - скрипт обработки строки поискового запроса, убирающий лишние символы . . —> <SCRIPT LANGUAGE="JavaScript" SRC="include_js/highlight.js"> </SCRIPT> <!— gup - скрипт подсветки найденных ключевых слов <SCRIPT LANGUAGE="JavaScript" SRC="include_js/search_keywords.js"> </SCRIPT> <!— search_keywords - скрипт поиска ключевых слов . <BODY ONLOAD="show()"> <!— show() - функция выводящая результаты поискового запроса из скрипта search_keywords . . —> <Н2> Keyword Search </H2> <Р> <FORM ACTION="search_keywords.html"> <!-- - форма поиска ключевых слов . . . —> •«INPUT TYPE-"text" NAME-"search" size="20"/> <INPUT TYPE-"submit" VALUE="Search"/> </FORM> </P> <P STYLE="display:none"> . —> . —>
и скрипт search_keywords.js function show() ( if (gup("search")!="AAAAA") { var searchString = gup("search"); var re = RegExpjsearchString, "i") ; authorArray = document.getElementsByTagName("AUTHORS"); uriArray = document.getElementsByTagName("URI"); titleArray = document.getElementsByTagName("PTITLE"); keywordsArray = document.getElementsByTagName("KEYWORDS"); var resultString = "",- for (var counter=0; counter < keywordsArray.length; counter++) { stringl = keywordsArray[counter].innerHTML; var OK = re.exec(stringl); if (OK) { resultString = resultString + "<PXA HREF-=\"" + uriArray[counter].innerHTML + "\"> <i>" + authorArray[counter].innerHTML + "</i> " + titleArray[counter].innerHTML + "</A><BR/> <b>Keywords:</t» " + keywordsArray[counter].innerHTML + "</p>"; } } if (resultString=="") resultString = "Sorry, nothing found"; document.getElementById("show").innerHTML = resultString; highlightSearchTerms(searchString) ; ] ) Аналогично организован поиск по авторам, названиям и рефератам статей. Поиск по тексту статей. Для ускорения работы поисковой системы тексты статей сведены в один XHTML-файл, содержащий последовательность элементов text, содержимое которых — тексты статей без формул. Для того чтобы отделить «словесную часть» статьи от формул, идеально подходит текст статьи в формате MathML — достаточно просто убрать из текста элементы math, а затем и все теги (чтобы сократить объем индексного файла). Программу, которая выполняет такую операцию над MathML-файлом, легко написать на любом языке программирования, который поддерживает работу со строками. В результате работы скрипта мы получим список статей, в которых встречается искомый текст, и выведем его. Когда пользователь выбирает статью из списка, вызывается XHTML-файл статьи, в который вставлен скрипт подсветки искомого текста (рис. 6.26).
Lobacbevskii Journal of Mathematics Full-Text Search Main Page Editorial Board Contents Subscription Jf7hearticle ■.' oHhTaSe ■' .-.CePvrlgbti' Search LJM: Authors Titles Keywords Abstracts-Full Terts "Math Search results Alexander Kuznetsqv On a problem of Avhadiey Zlti~Gang Wang A New Subclass of Quasi-convex Functions with Respect to k^Symmctrie Points ,. .,. . Рис. 6.25. Получаем список статей, удовлетворяющих поисковому запросу The first and the last inequalities in (1) imply that the region of values /(&>isa subset of [i, 16]. In this paper we give a better lower estimate for /ui). Let и,. i^Gfl, and let a holomorphic univalent function/i;i maps the unit disk и = [;: | ;| < 1} onto a so that /<(>) = n-, and /id = wz, where reio, i > is a given constant The normalization of / means, that the hyperbolical distance between м-, and u*; is constant. Let us consider the functional |/«1)|"+ |/V)|"(I- \r\=f Ctf, a] = —; ;; , П > 0. WJ on the class s" of univalent holomorphic functions/(;i. ;eU Рис. 6.26. Переходим на одну из статей списка: искомая фраза подсвечена Для продвинутого пользователя. Структура индексного файла для поиска по тексту статей имеет вид <html> <head> <!— скрипт, осуществляющий поиск и выводящий результаты с помощью определенной в нем функции show() —> <script language="JavaScript" src="include_js/gup. js"x/script> <!-- gup - скрипт обработки строки поискового запроса, убирающий лишние символы . . . —> <script type="text/javascript"> var testresult="<h2> Search results </h2>"; var testString = gup("textkeywords"); var source_file =""; function show() ( // alert(testString) ; var re = new RegExp(testString) ; var TextArray = document.getElementsByTagName("text"); for (var i = 0; i < TextArray.length; i++) { stringl = TextArray[i].innerHTML; var OK = re.exec(stringl); if (OK) {source_file = TextArray[i].getAttribute("source") ;
author = TextArray[i].getAttributeC'auth") ; title = TextArray[i] .getAttribute("title") ; var testStringArray = testString.split(" "); var finalTestString = testStringArray[0]; for (var counterArray — 1; counterArray < testStringArray.length; counterArray++) { finalTestString = finalTestString + "+" + testStringArray[counterArray]; } testresult = testresult + "<pxa href=\"" + source_file + "?textkeywords=" + finalTestString + "\"><i>"+author+"</i> "+title+"</a></p>"; } } document.getElementById("output").innerHTML-testresult; } </script> </head> <body onload="show()"> <!-- последовательность элементов text с атрибутами source, auth, title. Содержимое этих элементов - тексты статей без формул. -> •ctext source="Volume_18/18_9.xhtml" auth="Ye. A. Dtkina" title="0n a Partial Differential Equation in 4-dimensional Euclidean Space"> <!-- текст статьи без формул —> </text> •ctext source="Volume_4/4_8 .xhtml" auth="D.V. Tunitsky" title="On contact equivalence of holomorphic Monge-Ampere equations."> <!-- текст статьи без формул --> </text>. <р id="output"> На этот элемент есть ссылка в скрипте поиска предназначен для вывода результатов поиска </р> </body> <html> Замечание. Описанный выше способ поиска пригоден для случая, когда нет ограничений на объем файлов, обрабатываемых браузером, а скорость передачи данных высока. Возможно, так оно и есть. Если же мы поместили коллекцию на сервер и пользователь заходит на сайт по сети, имеющей низкую скорость передачи данных, то страницы будут открываться невыносимо долго, а об эффективной работе не может быть и речи. На самом деле эта трудность не является непреодолимой — просто надо производить обработку информации не на стороне клиента, а на сервере. Фактически то, что делает скрипт, включенный в HTML-страницу, должен делать скрипт на сервере (например, PHP-скрипт). После такой модификации коллекция будет пригодной и для размещения на «удаленном» сервере.
Поиск по формулам — это значительно более сложная задача, чем поиск по тексту. Например, формулы х2 и а2 — одинаковые или разные? Или выражения аЪ и Ъа — совпадают или нет? Ясно, что в последнем случае ответ зависит от того, коммутативно ли умножение, т. е. для того, чтобы ответить на этот вопрос, надо знать, о чем текст: об элементарной алгебре или коммутативных кольцах. Подойти к решению такой задачи можно на основе семантического веба (см. главу 8), но это дело будущего (будем надеяться, недалекого). На данном этапе один из простых способов организации поиска по формулам в электронной коллекции состоит в следующем. Любая формула в формате MathML записывается как набор элементов (подзабыли? Перечитайте гл.З!). Например, выражение х2 записывается как <math><mi>x</mi><msup><mn>2</mn></msupx/math> Этой формуле соответствует последовательность элементов <math><mi></mi><msup><mn></mn></msup></math> Ясно, что одинаковым (одинаково записанным) формулам соответствует одна и та же последовательность элементов. Значит, поисковый запрос мы должны записать в нотации MathML, затем выделить последовательность элементов и организовать поиск статей, формулы которых содержат данную последовательность. Конечно, этот метод достаточно грубый — мы найдем и формулы, совершенно не похожие на искомую. Опыт показывает, что из-за того, что формулы записываются неоднозначно, лучше иметь избыток результатов поискового запроса, чем недостаток. Вместе с тем, надо быть готовым и к тому, что результаты поиска надо будет обрабатывать вручную, отбрасывая гору «мусора». В целом данный метод можно охарактеризовать как приближение нулевого порядка к решению крайне нетривиальной задачи поиска по формулам. Введем поисковый запрос: найти А —» В (рис. 6.27). Вот отрывок одной из статей, найденных в результате поиска, — формулы, удовлетворяющие запросу, система выделила цветом (см. рис. 6.28). Видно, что наряду с формулами, действительно удовлетворяющих данному запросу, выделены и формулы вида р е М и даже L(M). Для продвинутого пользователя. Одна из проблем, которую надо решить при организации поиска по формулам, — это введение поискового запроса. Это не так просто, ведь надо набирать не слова, а формулы, причем так, чтобы пользователь видел формулы на странице поиска в привычном виде, а программа получала строку в нотации MathML. Для решения этой задачи подходит скрипт asciimath, подробно описанный в п. 6.6. Приведем для сведения файл с формой поиска по формуле, использованный в нашей кол-
I 1 лг11ов1 Xlo t pc. civ cil d i^a,1 ejt с rii]j|j* ife e e L с е ч] Ij л I rt t' \ 11 sh I с * fi. jf vnth « * '» ' ц 4 aui ыргсяе I Mil sm к j np r 1 real III d I1.1 nl I hhav iiw e brine, amp lr t\ reasa pj r rhrrefgrc [ir-asc If iri sauql led v»ll lb re 11ч 41* nlejie takeInl af о nlthallbc rl krurcl lake II e nlri coo pulrrv " ^ f £ ■% -4" 1 "<■**. r' r Рис. 6.27. Вводим поисковый запрос For a Lie subgroup G с с;/.ml, consider the bundle Ec,(M) = цм^/в — м. Lets: м — eg<M) be a section. The Lie derivative of s with respect to a vector field X e X(M) is defined in the following way. For each xeXiM), the flow tp, of X induces the flow dp, on UMt whose projection onto Eg(M) gives a flow v>, on EG(M). The tangent vector field dtpjdt is the complete lift ~x e X(Ec(M)tofx . We denote by VF.a the vertical subbundleof tf.g{M) ; then the pullback bundle s'{VF.c)'\s a vector bundle over M , and for each p e m there is defined an isomorphism nr : <*'£г;)мр) — u"0'£(7>)r ■ Then (£*!>,,= Я(Х|Л/>11-ЛР1Х(;»)), is the Lie derivative of s with respect to X at a point /»e M . From the definition it immediately follows that-C.vs = 0 if and only if Xis an infinitesimal automorphism of s, i.e.. if the flow Ф, preserves s. Рис. 6.28. Результат поиска лекции (скриншот этой HTML-страницы показан выше; для лучшей читабельности мы пропустим в коде элементы оформления). <html> <head> <script language="JavaScript" src="include_js/ASCIIMathML.js"> </script> <script type="text/javascript"> translateOnLoad=false; var math_search_string; // function clearing the unnecessary elements from the // mathml string out and preparing // the string for the address line of browser function prepare_math_search_string(stringl) { // first we remove unnecessary elements from the // beginning and the end of the line string_array = stringl.split("blue")[1].substr(2).split("</mstyle>"); math_search_string = string_array[0]; //we remove all mrow math_search_string = math_search_string. replace ( /<mrow>/g, "■" ) ; math_search_string = math_search_string.replace(/<\/mrow>/g, ""); // we remove all the entities // alert(math_search_string); aux_string = math_search_string; math_search_string=""; for (i = 0; i < aux_string.length; i++) {
if (aux_string[i]=="<") {flag=true; i++;} if (aux_string[i]==">") flag=false; if (aux_string[i]=="/") i++; if (flag) math_search_string = math_search_string + aux_string[i]; } // alert(math_search_string); // we remove all mrow math_search_string = math_search_string.replace(/</g,"!open"); math_search__string = math_search_string.replace(/>/g, "!close") ; return(math_search_string) ; } function display_search() { var str = "amath " + document.getElementById("inputText").value; var outnode = document.getElementById("outputNode"); var n = outnode.childNodes.length; for (var i=0; i<n; i++) outnode.. removeChild(outnode. firstChild) ; outnode.appendChild(document.createTextNode(str)) ; AMprocessNode(outnode); math_string = document.getElementsByTagName("p")[0].innerHTML; /* math_string contains code prepared by ASCIIMathML something like <span style=... mathcolor="blue"> the string we need </mstyle></mathx/span> So we need function prepare_math__search which clears the unnecessary elements out! Moreover, this string contains symbols in Unicode which are to be recoded to html special symbols. And finally we need special procedure to make string for the address line of browser */ math_search_string = prepare_math_search_string(math_string); } function start_search() { var file_to_search="math_ind.html";//File to search var search = document.formsearch.keywords.value; { var searchUrl = file_to_search + "?keywords=" + math_search_string; location.href = searchUrl; И </script> </head> <body> <form name="formsearch"> Search Math <input id="inputText" name="keywords" size="40" type="text"/>
<input type="button" value="show" onclick="display_search()"/> <input type="button" value="search" onclick="start_search()"/> </form> <p id="outputNode"> </p> <p id="l"> </p> </body> </html>
7. СПЕЦИАЛИЗИРОВАННЫЕ ЯЗЫКИ РАЗМЕТКИ. СОЗДАНИЕ СОБСТВЕННОГО ЯЗЫКА РАЗМЕТКИ Язык MathML, о котором шла речь в предыдущих главах, предназначен для представления и автоматизированной обработки математических текстов. Однако математикам, в особенности тем, кто занимается прикладными задачами, будет интересно узнать, что на основе XML создан ряд специализированных языков разметки для различных областей науки и техники. В данной главе мы расскажем об этих языках и приведем краткие рекомендации по созданию собственного языка разметки. 7.1. Специализированные языки разметки С 1996 г., когда консорциум W3C предложил XML в качестве рекомендации, создано семейство языков разметки, основанных на XML. Самым ранним специализированным языком разметки на основе XML можно считать CML (Chemical Markup Language) — язык разметки химических формул, предназначенный для описания и обработки данных о химических соединениях. Близкими по назначению являются разработанные впоследствии Analytical Information Markup Language (AniML), Bioinformatic Sequence Markup Language (BSML), BlOpolymer Markup Language (BIOML), CellML, Computational Chemistry Markup Language (CCML), SpectroML, ThermoML и ряд других (см., например, [29]). С тех пор появилось много специализированных языков разметки. Вот некоторые из них. Materials Markup Language (MatML). Предназначен для описания свойств материалов. Документацию по работе с этим языком можно найти на официальном сайте этого языка www.matml.org. Geography Markup Language (GML). Этот язык используется географическим сообществом. Информацию о нем можно найти на сайтах http://www.opengis.net/gml/ и http://www.opengeospatial.org/ standards/gml, http://schemas.opengis.net/gml/ Cell Markup Language (CellML). Назначение этого языка — электронное хранение и обмен математическими моделями. Широко применяется в биологическом моделировании, поддерживает спецификацию MathML. Спецификацию этого языка см. в http://www.cellml.org/spe- cifications/cellmLl.O/indexJitml.
DTD-схема для CellML-документов подключается следующей инструкцией: <!DOCTYPE model SYSTEM "http://www.cellml.org/cellml/cellml_l_0.dtd"> Если в модели используются математические формулы и язык MathML, то также подключается DTD-схема MathML: < DOCTYPE model SYSTEM http://www.eel1ml.org/cellml/ce <!ENTITY % use mathml dtd ]> 'INCLDDE 11ml ■> 1 0 dtd [ DTD-схема CellML доступна по адресу http://www.cellml.org/cellml/cellmLl_0.dtd, a XML-схема — по адресу http://www.cellml.org/cellml/cellmLl_l.xsd. Инструменты для работы с CellML-документами можно найти на сайтах http://www.cellml.org/tools; http://www.cellml.org/downloads. Wireless Markup Language (WML). WML — это язык разметки документов для использования в сотовых телефонах и других мобильных устройствах по стандарту WAP. Официальная спецификация WML разработана и поддерживается WAP Forum, производственным консорциумом, основанным компаниями Nokia, Phone.com, Motorola и Ericsson. Эта спецификация определяет синтаксис, переменные и элементы, используемые в файлах WML. Последнее определение типа документа (Document Type Definition) доступно по адресу: http://www.wapforum.Org/DTD/wml_l.l.xml. В телефоне или любом другом коммуникационном устройстве, заявленном как WAP-совместимое, загружено специальное программное обеспечение (известное, как микробраузер), которое полностью «понимает», как обрабатывать все вариации WML 1.1 DTD. WML был разработан для устройств с низкой пропускной способностью и маленьким дисплеем. Была применена концепция дек и карт. Один WML-документ (точнее, элементы, содержащиеся внутри элемента <wml>) называется декой (deck). Интерактивное взаимодействие с пользователем осуществляется с помощью карт (card). Достоинство такой реализации заключается в том, что несколько экранов может быть загружено на клиентское устройство за один раз. С использованием WMLScript обработка действий пользователя может быть произведена с применением находящихся в одной деке карт, исключая тем самым множественные транзакции с сервером.
WML-документ, организующий выбор имени пользователя из предложенного списка, проверку пароля и вывод на экран полученных данных, имеет вид <?xml version="l.0"?> <!DOCTYPE vrail PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/vrail_l.1.xml"> <wml> <card id="Login" title="Login"> <do type="accept" label="Password"> <go href="#Password"/> </do> <p> UserName: <select name="name" title="Name:"> <option value="John Doe">John Doe</option> <option value="Paul Smith">Paul Smith</option> <option value="Joe Dean">Joe Dean</option> <option value="Bill Todd">Bill Todd</option> </select> </p> </card> <card id="Password" title="Password:"> <do type="accept" label="Results"> <go href="#Results"/> </do> <p> Password: <input type="text" name="password"/> </p> </card> <card id="Results" title="Results:"> <p> You entered:<br/> Name: \$(name)<br/> Password: \$(password)<br/> </p> </card> </wml> Comic Book Markup Language (CBML). Этот любопытный язык применяется для создания электронных коллекций комиксов. Подробную информацию о нем можно найти на сайте http://www.cbml.org/technical.html (см. рис. 7.1). Рис. 7.1. CBML — язык для создания электронных коллекций комиксов
Верификация документов осуществляется с помощью DTD-объявлений, которые подключаются в документ следующей инструкцией: <!DOCTYPE cbml PUBLIC "-//CBML Project//CBML Main Driver File//EN" "cbml.dtd"; Созданы языки разметки и для других предметных областей. Названия языков, как правило, отражают их назначение: Business Rules Markup Language (BRML), Geography Markup Language (GML), Finite Element Modeling Markup Language (femML), Ink Markup Language (InkML), Mathematics Education Markup Language (MeML), Materials Markup Language (MatML), Numerical Data Markup Language (NDML), Relational-Functional Markup Language (RFML), Robotic Markup Language (RoboML), Voice Extensible Markup Language (VoiceXML). В работе [29] предложена классификация уже созданных языков разметки в виде карты языков XML. Несколько подробнее остановимся на языке Chemical Markup Language (CML), так как он является примером языка разметки, основанного на XML, и имеет достаточно развитые приложения. Chemical Markup Language (CML). Назначение CML и область применения. Язык CML разметки химических формул разработан как часть проекта Open Molecule Foundation. С помощью CML можно записать: молекулярные структуры; химические реакции; спектры; вычислительные процессы; неорганические кристаллы; объекты квантовой химии; физические величины (см. [30-41]). CML-документы являются специализированными XML-документами, поэтому для их создания и обработки можно использовать как обычные текстовые редакторы, так и специальные программные средства, ориентированные на XML-технологии. Имеется большой набор программных продуктов для поддержки CML, в том числе для отображения информации в формате CML в браузерах. Приведем пример CML-документа из [42]: <cml> <molecule id="ml"> <atomArray> <atom elementType= <atom elementType= </atomArray> </molecule> </cml> 'N' '0' /> /> Элементом верхнего уровня является cml — все последующие элементы в нем содержатся. Молекулярная структура описывается содержимым элемента molecule с атрибутом id="ml". Список атомов записан с помощью элемента atomArray. Пустой эле-
мент <atom elementType="N"/> определяет атом азота, a <atom elementType="0"/> — атом кислорода. Другой пример — молекула воды НгО в нотации CML: <?xml version="l.0" encoding="UTF-8" ?> <cml xmlns="http://www.xml-cml.org/schema" xsi:schemaLocation= "http://www.xml-cml.org/schema . ./../schema.xsd" xmlns:xsi="http://www.w3.org/200l/XMLSchema-instance"> <molecule title="Waterl"> <atomArray> <atom id="al" elementType="H" hydrogenCount="0"/> <atom id="a2" elementType="0" hydrogenCount="2"/> <atom id="a3" elementType="H" hydrogenCount="0"/> </atomArray> <bondArray> <bond atomRefs2="al a2" order="l"/> <bond atomRefs2="a2 a3" order="l"/> </bondArray> </molecule> </cml> Много других интересных примеров можно найти в [43, 44]. Набор элементов. Полный список элементов (всего 137) и атрибутов языка CML можно найти на сайте http://cml.sourceforge.net/schema/attributetable.html. DTD и XML Schema для CML. DTD-схема для CML-документов подключается следующей инструкцией: <!DOCTYPE cml SYSTEM "http://www.xml-cml.org/dtd/cmll_0_l.dtd"> В настоящее время используются XML-схемы CML2.4 (http://www.sour- ceforge.net/projects/cml/schema24). Программные инструменты CML. В работе [45] дан обзор основных программных инструментов, используемых при работе с CML-до- кументами. Приведем в качестве примера отображение молекулы с помощью ЗЭ-просмотрщика химических структур Jmol: http://jmol.sourceforge.net/. Jmol — комплекс кроссплатформенных приложений на языке Java, включающий: JmolApplet — java-апплет для браузеров, который можно интегрировать в веб-страницы; Jmol — приложение, запускаемое на локальном компьютере (на котором установлена Java) и набор библиотек JmolViewer, которые могут быть интегрированы в другие java-приложения. Отметим, что Jmol является свободно распространяемой программой с исходным открытым кодом.
Следующий CML-файл описывает молекулу, состоящую из двух атомов. Файл 7 1 l.xml <?xml version="1.0" encoding="UTF-8" ?> <cml xmlns="http://www.xml-cml.org/schema" xsi:schemaLocation="http://www.xml-cml.org/schema . .I. ./schema.xsd" xmlns:xsl="http://www.w3.org/2001/XMLSchema-instance" xmlns:siUnits="http://www.xml-cml.org/units/siUnits" xmlns:units="http://www.xml-cml.org/units/units" xmlns:castep="http://www.materialsgrid.org/castep/namespace" xmlns: cml="http: //www.xml-cml. org/dict/cmlDict" > <parameterList id="input" title="Input Parameters'^ <parameter name="Release" dictRef="castep:release" value="Academic Release" /> <parameter name="Version" dictRef="castep:version" value="3.2" /> <parameter name="Task" dictRef="castep:task" valUe="GEOMETRYOPTIMIZATION" /> <parameter dictRef="castep:xcFunctional" value="PBE" /> <parameter dictRef="castep:cutoff"> <scalar units="units:ev">330.000000000 </scalar> </parameter> <parameter name="Number of Electrons" dictRef="castep:nElectrons" value="9" /> <parameter name="Net Charge" dictRef="castep:netCharge" value=" 0" /> <parameter name="Net Spin" dictRef="castep:netSpin" value="l" /> <parameter name="Fix Spin" dictRef="castep:fixSpin" value="false" /> <parameter name="Fix Occupancy" dictRef="castep:fixOcc" value="false" /> <parameter name="MetalsMethod" dictRef="castep:metalsMethod" value="DM" /> <parameter name="Geom Method" dictRef="castep:geomMethod" value="BFGS" /> <parameterList id="pspots" title="PseudopotentialFiles"> <parameter name="PSPFile" dictRef="castep:pspFile" value="C_OOPBE.usp" /> <parameter name="PSPFile" dictRef="castep:pspFile" value="Ta_OOPBE.usp" /> </parameterList> </parameterList> <module title="Initial System"> <molecule> <atomArray> <atom elementType="C" id="al" xFract="0.000" yFract="0.000" zFract-" 0.000"/> <atom elementType="Ta" id="a2" xFract="0.500" yFract=" 0.500" zFract=" 0.500"/>
</atomArray> </molecule> <crystal id="initStruct" dictRef="castep:ucell"> <scalar title="a" dictRef="cml:a" units="units:ang" xmlns:cml="http://www.xml cml.org/diet/cmlDict"> 3.230 </scalar> <scalar title="b" dictRef="cml:b" units="units:ang"> 3.230 </scalar> <scalar title="c" dxctRef="cml:c" unxts="unxts:ang"> 3.230 </scalar> <scalar txtle="alpha" dxctRef="cml:alpha" dataType="xsd:double" units="units:deg"> 60.000 </scalar> <scalar txtle="beta" dictRef="cml:beta" units="units:deg"> 60.000 </scalar> <scalar txtle="gamma" dxctRef="cml:gamma" unxts="units:deg"> 60.000 </scalar> </crystal> </module> <module title="Final System"> <molecule> <atomArray> <atom elementType="C" id="al" xFract="0.000" yFract="0.000" zFract=" 0.000"/> <atom elementType="Ta" id="a2" xFract="0.500" yFract=" 0.500" zFract=" 0.500"/> </atomArray> </molecule> <crystal id="initStruct" dictRef="castep:ucell"> <scalar title="a" dictRef="cml:a" units="units:ang"> 3.230 </scalar> <scalar title="b" dictRef="cml:b" units="units:ang"> 3.230 </scalar> <scalar title="c" dictRef="cml:c" units="units:ang"> 3.230 </scalar> <scalar title="alpha" dictRef="cml:alpha" units="units:deg"> 60.000 </scalar> <scalar title="beta" dictRef="cml:beta" units="units:deg"> 60.000 </scalar> <scalar title="gamma" dictRef="cml:gamma" units="units:deg">
60.000 </scalar> </crystal> <property title="Total Energy" dictRef="castep:Etot"> <scalar units="units:ev"> -2.92669908E+002 </scalar> </property> </module> <metadata name="castep:totalTime" content="12.2900000792" convention="siUnits:s" /> </cml> При открытии этого файла с помощью Jmol видим ЗО-изображение этой молекулы (рис. 7.2). Рис. 7.2. ЗЭ-изображение молекулы, полученное при открытии файла 7 1 l.xml с помощью Jmol Jmol имеет достаточно много возможностей, включая анимацию и конвертацию изображений в разные форматы, в том числе создание веб-страниц, содержащих изображения молекул. Вот изображение молекулы бензина (соответствующий cml-документ слишком велик, чтобы привести его здесь), которое сохранено с помощью Jmol как jpg-файл (рис. 7.3). Рис. 7.3. Изображение молекулы бензина, полученное с помощью Jmol
7.2. Создание собственного языка разметки на основе XML Думаем, что нашему читателю уже ясны потенциальные возможности применения XML-технологий для создания и автоматизированной обработки научных документов. Пример MathML, так же, как и примеры других специализированных языков разметки, показывают, что на основе XML можно организовать язык разметки, адаптированный практически к любой предметной области. Следует отметить, что эта предметная область не обязана быть широкой, как, например, вся математика или вся химия. Язык разметки может понадобиться для работы с информацией, относящейся к весьма узкой области, например, посвященной конкретной технологии или решению какой-либо научной проблемы. Кстати, когда в разделе 6.7 создавалась собственная коллекция электронных документов, речь по существу шла о разработке своего специализированного языка разметки. Выделим основные шаги, которые надо предпринять для создания языка разметки, основанного на XML. Проанализировав предметную область и задачи, которые будут решаться с использованием данного языка, необходимо: • определить набор элементов и указать их атрибуты. • создать DTD-схемы и/или XML-схемы; • построить набор XSL-преобразований для обработки XML-документов, использующих построенный набор элементов; • разработать программные средства для управления XML-документами, в частности, обеспечивающими их представление в стандартных форматах; • подготовить спецификацию языка. Кратко поясним необходимость указанных шагов. Как вы знаете, XML-документы могут содержать произвольные элементы, которые в свою очередь могут содержать атрибуты. Набор элементов и их назначение в каждом конкретном случае определяются поставленной задачей, и выделение такого набора само по себе является проблемой, требующей серьезного предварительного анализа исходной задачи. Если на создаваемом языке предполагается организовывать сложные системы документов, то необходимо выработать правила, которым должны удовлетворять эти документы, иначе неизбежные ошибки приведут к неработоспособности всей системы. Такие правила задаются как наборы DTD-правил или с помощью XML-схем. После составления набора правил можно будет отбирать правильные (удовлетворяющие правилам) документы — при обработке XML-процессором будут автоматически исключены XML-файлы, не прошедшие синтаксическую проверку (см. раздел 2.6). Кроме того, для использования языка необходим набор XSL-преобразований, обеспечивающий трансляцию документов в другие, в том
числе, стандартные, форматы (см. раздел 2.7). Развитые языки разметки, имеющие большие наборы элементов, предполагают, что для отображения документов должны использоваться специализированные программные средства. Например, одним из таких средств для CML является Java-вьюер Jmol, а для MathML — модуль MathPlayer. Наконец, распространение нового языка невозможно без указания его назначения и возможностей, описания набора тегов и правил формирования документов, а также ссылок на ресурсы, обеспечивающие работу с документами.
8. ЭПИЛОГ: ПРИНЦИПЫ СЕМАНТИЧЕСКОГО ВЕБА Если вы читаете этот текст, то, скорее всего, ознакомились хотя бы с частью того, что было написано до этого. Теперь вы знаете, как работают информационные технологии (более точно, технологии XML) в применении к математике. Надеемся, что наш труд не пропал даром, и вы будете использовать компьютер не только как инструмент для набора и простейшего поиска в сети. То, о чем мы рассказали, — уже работающие апробированные средства сегодняшнего (или, может быть, уже вчерашнего) дня. Однако, может быть, у вас осталось чувство неудовлетворенности и вы понимаете, что в описанных нами средствах есть огромный пока еще не реализованный потенциал? Что применения, о которых мы рассказали, — это только самое начало настоящих применений, последствия которых еще трудно себе представить? Если это так, то вы правильно понимаете ситуацию. В этой небольшой главе (ее смело можно было озаглавить «пролог», а не «эпилог») мы попытаемся рассказать об информационных технологиях, над которыми идет работа в настоящее время и которые вскоре перевернут мир. Безбрежность сети и, в то же время, скудость нужной информации, полученной при поиске в сети, — типичная ситуация, с которой сталкивается современный пользователь интернета. Повсеместное распространение компьютеров во всех сферах деятельности и развитие интернета делают доступным все больший объем информации, поэтому отлаженные приемы обработки информации становятся менее эффективными. Поиск нужной информации стал серьезной проблемой: поисковые машины, индексирующие html-страницы, находят много ответов на запрос и охватывают большую часть всего веба, однако количество неудовлетворительных возвращаемых ответов слишком велико, поскольку не существует понятия «правильности» ответов на запросы. Дело в том, что поиск основан на сравнении строки запроса со строками документов, но при этом никак не учитывается смысл информации, ради которой и был организован поиск. Такая ситуация возникла сравнительно недавно, когда развитие интернета привело к тому, что объемы информации, получаемой при поиске, стали намного превышать возможности человеческого восприятия. Отметим, что совокупность технологий первоначального интернета, получившая впоследствии название Web 1.0, была ориентирована только на формальное содержание документов (контент). В настоящее время используется
набор технологий, который принято обозначать Web 2.0 и который также оперирует в основном с контентом [46, 47]. Ведущие производители программного обеспечения, в числе которых компании Oracle, IBM, Adobe, Sun, Microsoft и Mozilla Inc., в качестве основного направления развития интернета на ближайшие годы разрабатывают новую систему, обозначенную как Web 3.0 и основанную на семантической обработке информации. Разработка этого комплекса технологий координируется консорциумом W3C. Особенность этой системы состоит в том, что программные модули (а не пользователи!), опираясь на метаданные и метабазы, осуществляют поиск информации по содержимому, включая поиск по видео- и цифровым изображениям. Основная задача Web 3.0 заключается в решении самой сложной проблемы развития интернета — поиска значимой информации, отделения ее от информационного мусора. Семантический веб рассматривает интернет в целом как глобальную базу данных (БД). Точно так же, как разработчик запрашивает сведения из обычной БД и создает приложения, оперирующие этой информацией, любой пользователь семантической сети получает возможность собирать данные и в соответствии со своими потребностями строить приложения, обрабатывающие взаимосвязанные, но разрозненные сведения из различных источников [48]. Это соответствует программному заявлению Т. Бернерса-Ли: «... основной ролью технологий семантического веба является интеграция данных, содержащихся в различных приложениях». Название Semantic Web появилось в 2001 г. в статье [49], аналогичное название получил проект консорциума W3C. В русскоязычной компьютерной литературе в последнее время используют термины «семантический веб», «семантическая сеть» и «семантическая паутина». Слово «семантика» дало название проекту и определило общее направление развития. Общее определение понятия «семантика» — это изучение значений. Слово «семантика» происходит от греческого semantikos, т.е. «важное значение». Компьютер должен понимать семантику документа в том смысле, что он не просто интерпретирует набор символов, содержащихся в документе, а выделяет смысл документа. Имеется несколько определений понятия Semantic Web, наиболее подходящим из которых, на наш взгляд, является определение, приведенное в электронной энциклопедии Википедия (см. [46]): «Семантическая паутина — часть глобальной концепции развития интернета, целью которой является реализация возможности машинной обработки информации, доступной во Всемирной паутине. Основной акцент концепции делается на работе с метаданными, однозначно характеризующими свойства и содержание ресурсов Всемирной паутины, вместо используемого в настоящее время текстового анализа документов. В семантической паутине предполагается повсеместное использование, во-первых, универсальных идентификаторов ресурсов (URI),
а во-вторых — онтологии и языков описания метаданных». Предполагается, что семантика способна однозначно охарактеризовать найденный контент по ряду характерных признаков. Архитектура семантической сети предполагает наличие у любой информации, находящейся в сети, связанного с этой информацией точного смысла, который нельзя перепутать даже в случае совпадения фраз или слов, встреченных в разных контекстах. Фактически это означает, что любая информация связана с некоторым неотделимым от нее контекстом [50]. Семантический веб использует несколько основных технологий для выявления смысла данных. Для трактовки данных он использует универсальный идентификатор ресурсов (URI). При этом URI рассматривается в более широком смысле — не только как ссылки на электронные адреса и веб-страницы, как в традиционной схеме, но и для обозначения любых объектов и ресурсов (люди, города, предметы и др.). Сейчас большая часть информации в сети совершенно не приспособлена для компьютерной обработки, поэтому не удалось создать программы, которые были бы способны разобраться в смысловой составляющей текста, например, сгруппировать несколько текстов в одну общую категорию. В семантической паутине предлагается использовать форматы описания, доступные для машинной обработки и позволяющие решить эту задачу. Для определения собственной структуры документов в семантической сети используют язык XML, а для формализации метаданных, а также сведений о контексте - RDF. Для записи конструкций RDF можно использовать RDF/XML, являющийся подмножеством языка XML, а для описания структуры документов — RDF Schema. Для построения семантически связанной сети недостаточно только технологий XML и RDF, поэтому консорциумом W3C был создан язык онтологии OWL (Ontology Web Language). Возможность OWL создавать онтологии играет ключевую роль в категоризации и классификации групп взаимосвязанных (related) данных [48]. Семантический веб создается как надстройка над уже существующими системами сетей, но при этом поиск и обработка информации организуются как машиноориентированные. Чтобы это стало возможным, производится дублирование содержания контента в метабазы. Информация, предназначенная для людей, готовится в виде текста, образов и звуков, а для машин — в виде специальных кодов. Семантический веб объединяет эти виды информации в единую структуру, в которой каждому элементу «человеческой» информации будет соответствовать машинный код — специальный смысловой тег. Метаданные должны в обязательном порядке включать сведения о том, как, где и кем была собрана данная информация и как она структурирована. При описании многослойной архитектуры семантической сети обычно используют диаграмму, впервые предложенную Т. Бернерсом-Ли в презентации [51] и получившую название layer-cake, а в русскоязыч-
Рис. 8.1. «Пирог Тима Бернерса-Ли» ной литературе — «пирог Тима Бернерса-Ли» (см. рис. 8.1). Дадим краткое описание этих слоев. Первый слой «Unicode и URI». Unicode — это стандартная кодировка для представления символов. URI (Uniform Resource Identifier) — универсальный идентификатор ресурсов — это просто идентификатор ресурсов, с которыми мы постоянно сталкиваемся при работе в интернете (например, http://www.ksu.ru). Слой XML и связанных с ним стандартов. XML предоставляет синтаксис для определения структуры документа, подлежащего машинной обработке. Синтаксис XML не несет семантической нагрузки. XML-Schema определяет ограничения на структуру XML-документа. Стандартный синтаксический анализатор языка XML в состоянии проверить произвольный XML-документ на соответствие его структуры так называемой схеме документа, описанной в XML-Schema. «Схема» — это просто документ или фрагмент кода, управляющий множеством терминов в другом документе или фрагменте кода, как главный контрольный список или грамматика определений. RDF представляет собой простой способ описания экземплярных данных в формате субъект-отношение-объект, в котором в качестве любого элемента этой тройки используются только идентификаторы ресурсов. Существует стандартизованное отображение этих троек на XML-документы предопределенной структуры (т. е. консорциумом W3C определена схема XML-документов, содержащих RDF-описания), а также на другие форматы представления (например, в нотацию NS). Схема RDF была разработана как простая модель типизации данных для RDF. RDF-Schema описывает набор атрибутов (здесь их точнее назвать отношениями) для определения новых типов RDF-данных. Слой онтологии (Ontologe vocabulary). Онтологии предназначены для описания более сложных конструкций, включающих в себя типы ресурсов и их свойства. Язык онтологии веба OWL расширяет возможности по описанию новых типов (в частности, добавлением перечислений), а также позволяет описывать новые типы данных RDF-
Schema в терминах уже существующих (например, определять тип, являющийся пересечением или объединением двух существующих). Слой логики и доказательства (Logic and Proof). Логический слой необходим как средство для формулировки в документах логических выражений. Это позволяет, например, записывать правила вывода документов одного типа из документов другого типа; проверять соответствие содержимого документа некоторому множеству правил непротиворечивости; преобразовать запросы для замены неизвестных терминов известными. Примером приложения этого уровня является преобразование запросов к одной базе данных в запросы к другой базе данных в случае, когда базы данных на вебе построены независимо и объединены с помощью семантических ссылок. Слой управления доверием (Trust) — это завершающий слой. Этот компонент находится еще на этапе разработки, одним из его элементов является, например, технология цифровой подписи. Как известно, реализованная машина логического вывода должна быть тесно связанной с системой верификации подписей, а грамматический разбор документов должен давать в результате не просто деревья утверждений, а деревья утверждений о том, кто и какие утверждения подписывал. При проверке доказательств для правил вывода должна проверяться логическая корректность, но для утверждений о наличии подписи в документе должна проверяться корректность этой подписи. В конечном счете мы должны получить структуру, в которой можно выражать и вычислять соотношения доверительности и надежности на всем множестве систем, базирующихся на открытом ключе. Как результаты, так и способы их получения одинаково ценны. Откуда мы получаем данные, кто их создал, когда, почему и как они были получены — так же важно для пользователя и провайдера службы, как и сами данные (см. [52]). Этими вопросами в семантическом вебе занимаются такие приложения, как Доказательства, Доверие и Цифровые подписи. Возможными приложениями семантического веба и технологиями баз данных будут приложения по сопровождению аннотаций комментариями и ссылками на источники, по объяснению, почему выбранные параметры использовались при работе алгоритма и каковы эти параметры. Научное знание контекстуально и субъективно. Контексты изменяются, а мнения противоречивы. Новая информация может как поддерживать господствующую точку зрения, так и противоречить ей, приводя к ревизии понятий. Анализ этих аналитических высказываний может привести к появлению нового знания, но этот анализ должен быть доступен для всех, иначе им будет невозможно воспользоваться. Для надежного хранения научные знания дублируются и архивируются. Очень важно уметь представлять себе срез состояния умов в данный момент в данном месте для осознания научной точки зрения, господствующей в это время. Однако по мере развития коллекций
данных и аналитических приложений прослеживать последствия изменений становится все труднее. При модификации баз данных ученые вынуждены заново формулировать свои запросы, новые знания изменяют фактическую область анализа. Ошибки или информация, потерявшая достоверность, продолжают распространяться и с трудом поддаются элиминации. Онтологии и правила также изменяются. Новые верования заставляют изменять онтологии, но прежние выводы и заключения, перестающие быть справедливыми, при этом не исчезают автоматически (и как вообще мы следим за влиянием этих изменений?). Они должны продолжать сосуществовать и быть доступными. Мониторинг событий и сущностей может быть описан с помощью онтологии. Графический способ представления основных технологий семантического веба, предложенный Т. Бернерсом-Ли, получил развитие — можно найти схемы с другой организацией слоев (см., например, [53]). В частности, в Википедии [46] приведена схема, представленная на рис. 8.2. Рис. 8.2. Стек понятий семантической паутины из Википедии Т. Бернерс-Ли предложил следующий способ определения, действительно ли в том или ином продукте реализована технология семантического веба: следует лишь обратить внимание на поддержку стандартов. Если продукт не поддерживает такие основополагающие стандарты, как RDF, OWL или SPARQL, то он к семантическому вебу не имеет никакого отношения [48]. Необходимость развития технологий Web 3.0 разъясняется в следующем фрагменте из работы [54]: «Учитывая эти факты, трудно оспаривать XML как механизм обмена в Сети. Однако модель XML порождается главным образом самими документами; более точно — тексто-
выми документами с иерархической структурой. Например, правильно составленный XML-документ может иметь элемент us-address, содержащий элементы US-street-address-line и US-zip-code. С точки зрения «чистого» XML у нас нет ничего, кроме основанного на данном документе описания имен и заданного в нем расположения этих элементов: а именно, мы знаем лишь, что элемент US-address содержит элемент US-zip-code, являющийся строкой. Мы вполне можем составить документ, содержащий два элемента US-zip-code. В XML-схеме для элемента US-address можно достичь большего, задав определенные ограничения на его структуру, например, что этот элемент может содержать несколько элементов US-street-address-line, но лишь один элемент us-zip-code. Имея эту схему, валидатор сможет вывести, что подобный элемент US-street-address, содержащий два элемента US-zip-code, является синтаксически неправильным. Однако фактически такая схема не позволяет уловить большую часть семантики понятия «адрес». Например, если мы встретим несколько отдельных документов, в которых указаны адреса, совпадающие полностью за исключением почтового индекса, то мы не сможем распознать, основываясь лишь на описанной схеме, что, по меньшей мере, один из этих индексов является ошибочным. Аналогично, не существует способа задать автоматическое преобразование между двумя очень похожими схемами кодирования адреса (например, если в одной из схем имеется ровно один элемент US-street-address, содержащий в свою очередь несколько элементов us-street-address-line). Далее, если мы захотим сделать нечто чуть более сложное, например, интегрировать эти элементы US-street-address с базой данных о нашем персонале, нам придется во всем полагаться на человека-программиста. Нужно будет, чтобы кто-то установил правильное отображение объектов US-address в различные поля нашей базы данных, причем данное отображение будет чувствительным даже к малейшим изменениям формата наших XML-данных или полей базы данных — не говоря уж о возможности использовать то же отображение в других не связанных с нами системах. Еще более удручающим является то, что не существует очевидного способа связать наши данные в US-address с более общими фактами об адресах, например, что каждый адрес задает некое местоположение, что на них можно отправлять почту или же что адреса связаны с конкретными людьми или фирмами. И уж заведомо ни XML-модель, ни XML-схема не в состоянии выразить мысль, что почтовые адреса в некотором роде сходны с номерами факсов, по крайней мере, в том смысле, что отправка письма по адресу и факсимильного сообщения по определенному номеру позволяет передать текст послания некоему получателю. В сети же нам крайне важна семантика такого рода. Мы хотим уметь привязывать адреса, закодированные с помощью языка XML в некотором веб-документе, к конкретным людям, местоположению,
понятиям, письмам, другим документам, базам данных, справочникам, спискам адресатов в электронной записной книжке, календарям, сенсорам, услугам и всевозможным другим сетевым ресурсам. Если все это сделать правильно, то такие связки позволят автоматически обрабатывать информацию, хранящуюся в различных формах и форматах, с помощью компьютерных программ. Безусловно, язык XML является важной составляющей для решения этих проблем, но маловероятно, что XML-модель данных способна подходящим образом представить все эти взаимосвязи и закодированную в них семантику реального мира». В заключение отметим, что в настоящее время уже работают сайты, созданные по технологии Web 3.0 [46], например, http://www.sun.com/servers/wp.html/, http://www.forum.nokia.com/, http://pressroom.oracle.com/, http://www.harpers.org/.
Список литературы h-ПариновС.И. Онлайновая революция в науке начинается // Соционет [электронный ресурс]. — http: // sparinov.socionet.ru/files/online-future- science-full.doc.ru. 2. Когаловский М.Р., Паринов СИ. Технология поддержки электронных научных публикаций как «живых» документов // Тр. 11-й Всерос. науч. конф. «Электронные библиотеки: перспективные методы и технологии, электронные коллекции RCDL'2009». — Петрозаводск: Иэд-во Петрозаводск, ун-та, 2009. - С. 53-58. 3. Mathematical Markup Language (MathML) Version 2.0 (Second Edition) W3C Recommendation [электронный ресурс]. — http://www.w3.org/TR/ MathML2/. 4. Miner R., Schaejfer J. A gentle introduction to MathML [электронный ресурс]. — http: // www.dessci.com/en/reference/mathml/. 5. Sandhu Pavi. The MathML handbook. - Charles River Media, 2003. — 518 p. 6. Hagen Hans. MathML, Hasselt, January 2001 / June 2008 [электронный ресурс]. — www.pragma-ade.com. 7. Berners-LeeT. Semantic Web road map [электронный ресурс]. — http://www.w3.org/DesignIssues/Semantic.html; рус. перевод: http://grid- club.ru/library/publication.2007-04-23.2195467714/vi. 8. W3C Semantic Web activity statement [электронный ресурс]. — http://www.w3.org/2001/sw/Activity. 9. Hendler J. Agents and the Semantic Web // IEEE Intelligent Systems J. — March/April 2001. - V. 16, No 2. - R 30-37. 10. Кищенко O.H. Языки информационного обмена. Интернет-университет информационных технологий [электронный ресурс]. — http://www.intuit.ru/department/internet/lande/. 11. Extensible Markup Language (XML 1.0) (Second Edition). W3C Recommendation 6 October 2000 [электронный ресурс]. — http://www.w3. org/TR/2000/REC-xml-20001006; рус. перевод - http://www.rol.ru/news/ it/helpdesk/xmlOl.htm]. 12. Le Hors Arnaud. XML 1.1 and Namespaces 1.1 revealed [электронный ресурс]. — http://www.ibm.com/developerworks/library/x-xmlnsll.html; http://www.compdoc.ru/internet/xml/l_l_specifications/; рус. перевод, например, http://www.compdoc.ru/internet/xml/l_l_specincations/]). 13. Namespaces in XML 1.0 (Second Edition). W3C Recommendation [электронный ресурс]. — http://www.w3.org/TR/xml-names/. 14. Питц-Моултис Н., Кирк Ч. XML. - СПБ: БХВ-Петербург, 2000. - 736 с. 15. Хабибуллин И.Ш. Самоучитель XML. - СПБ: БХВ-Петербург, 2003. - 336 с. 16. XML Schema Language: Part 0 Primer [электронный ресурс]. — http://www.w3.org/TR/xmlschema-0/; рус. перевод — http://www.citforum. ru/internet/xml/scheme/. 17. XML Schema Version 1.1 Part 1: Structures [электронный ресурс]. — http://www.w3.org/TR/2005/WD-xmlschemall-l-20050224/structures.html.
18. Extensible Stylesheet Language (XSL) Version 1.1. W3C Recommendation [электронный ресурс]. — http://www.w3.org/TR/xsl/. 19. XSL Transformations (XSLT) Version 1.0. W3C Recommendation [электронный ресурс]. - http://www.w3.org/TR/1999/REC-xslt-19991116; рус. перевод — http://www.rol.ru/news/it/helpdesk/xslt01.htm. 20. XSL Transformations (XSLT) Version 2.0. W3C Recommendation [электронный ресурс]. — http://www.w3.org/TR/xslt20. 21. XML Path Language (Xpath) Version 1.0. W3C Recommendation [электронный ресурс]. — http://www.w3.org/TR/xpath. 22. XPath Tutorial [электронный ресурс]. — http://www.w3schools.com/xpath/. 23. Resource Description Framework (RDF) / W3C Semantic Web Activity [электронный ресурс]. — http://www.w3.org/RDF/. 24. Dublin Core Metadata Element Set [электронный ресурс]. — http://purl.org/metadata/dublin_core_elements. 25. Храмиов П.Б., Брик С.А., Русак A.M., Сурин А.И. Введение в JavaScript [электронный ресурс]. — http://www.intuit.ru/department/internet/js/. 26. Основы XML [электронный ресурс]. — http://www.intuit.ru/department/in- ternet/xml/. 27. Адаме Д. Р., Флойд К. С. Основы работы с XHTML и CSS [электронный ресурс]. — http://www.intuit.ru/department/internet/xhtml/). 28. The Unicode Character Code Charts by Script [электронный ресурс]. — http://www.unicode.org/charts/. 29. Лозовюк А. Комета по имени XML [электронный ресурс]. — http://www.marketer.ru/. 30. Rzepa H. S. The Chemical Semantic Web: the future of science communication and publishing [электронный ресурс]. — http://rzepa.ch.ic.ac.uk; http://rzepa.net. 31. Murray-Rust P., Rzepa H.S. Chemical Markup, XML, and the Worldwide Web. 1. Basic principles // J. Chem. Inf. Compuf. Sci. - 1999. - V.39. - P.928-942 [электронный ресурс]. — http://www.ch.ic.ac.uk/rzepa/cml.pdf; http://pubs.acs.org/doi/abs/10.1021/ci990052b. 32. Murray-Rust P., Rzepa H.S. Chemical Markup, XML and the World- Wide Web. 2. Information Objects and the CMLDOM // J. Chem. Inf. Comput. Sci. — 2001. — V.41. — P. 1113-1123 [электронный ресурс]. — http://pubs.acs.org/doi/abs/10.1021/ci000404a. 33. Gkoutos G. V., Murray-Rust P., Rzepa H.S., Wright M. Chemical Markup, XML, and the World-Wide Web. 3. Toward a Signed Semantic Chemical Web of Trust // J. Chem. Inf. Comput. Sci. - 2001. - V.41. - P. 1124-1130 [электронный ресурс]. — http://pubs.acs.org/doi/abs/10.1021/ci000406v. 34. Murray-Rust P., Rzepa H.S. Chemical Markup, XML, and the World Wide Web. 4. CML Schema // J. Chem. Inf. Comput. Sci. - 2003. - V. 43. — P. 757-772 [электронный ресурс]. — http://pubs.acs.org/doi/abs/ 10.1021/ci0256541. 35. Murray-Rust P., Rzepa H.S., Williamson M.J., Willighagen E.L. Chemical Markup, XML, and the World Wide Web. 5. Applications of Chemical Metadata in RSS Aggregators // J. Chem. Inf. Comput. Sci. — 2004. — V. 44. — P. 462-469 [электронный ресурс]. — http://pubs.acs.org/doi/abs/ 10.1021/ci034244p.
36 Holliday G.L., Murray-Rust P., Rzepa H.S. Chemical Markup, XML, and the World Wide Web. 6. CMLReact, an XML Vocabulary for Chemical Reactions // J. Chem. Inf. Model. - 2006. - V.46. - P. 145-157 [электронный ресурс]. - http://pubs.acs.org/doi/abs/10.1021/ci0502698. 37 Kuhn S., Helmus Т., Lancashire R.J., Murray-Rust P., Rzepa H.S., Steinbeck C, Willighagen E.L. Chemical Markup, XML, and the World Wide Web. 7. CMLSpect, an XML Vocabulary for Spectral Data // J. Chem. Inf. Model. - 2007. - V. 47. - P. 2015-2034. 38 Adams N.. Winter J., Murray-Rust P., Rzepa H.S. Chemical Markup, XML and the World-Wide Web. 8. Polymer Markup Language // J. Chem. Inf. Model. - 2008. - V. 48. - P. 2118-2128. 39 Murray-Rust P., Rzepa H.S. Scientific publications in XML — towards a global knowledge base // Data Science. - 2002. - V. 1. — P. 84-98 [электронный ресурс]. — http://journals.eecs.qub.ac.uk/codata/Journal/ Contents/l_l/l_lpdf/DSl 15.Pdf. 40 Murray-Rust P., Rzepa H.S. STMML. A Markup Language for Scientific, Technical and Medical Publishing// Data Science. - 2002. — V. 1. - P. 1-65. 41 CML Frequently asked questions [электронный ресурс]. — http://cml.source- forge.net/historical/taq.html. 42 Amies A. Introduction to Extensible Markup Language for Chemistry and Biosciences [электронный ресурс]. — http://www.medicalcomputing.net/ xml_biosciences.html. 43 Amies A. Basic Biological Chemistry with Extensible Markup Language [электронный ресурс]. — http://www.medicalcomputing.net/biological _chem_computer2.html. 44. Jirat J. Chemical Markup Language 1.0 reference with examples [электронный ресурс]. — http://www.zvon.org/xxl/CMLL0/. 45. Amies A. Tools for working with Chemical Markup Language [электронный ресурс]. — http://www.medicalcomputing.net/cmltools.html. 46 Семантическая паутина. — Электронная энциклопедия Википедия [электронный ресурс]. — http://ru.wikipedia.org/wiki/. 47 Стренталл Д. Третий Веб [электронный ресурс]. — http://www.xakep.ru/ post/40176/. 48 Рапоза Д. Плетение «семантической паутины» // PC Week. — 2007. — №22. 49. Berners-Lee Т., Hendler J., Lassila О. The Semantic Web // Scientific American. — May 17, 2001; рус. перевод: Семантическая Сеть. — http://ezolin.pisem.net/logic/semantic_web_rus.Html. 50. Язык онтологии в Web. — http://wmast.com.ua/articIe.php. 51. Berners-Lee Т. Semantic Web on XML. - http://www.w3.org/2000/Talks/ 1206-xml2k-tbl/slidel-0.html. 52 Buneman P., Khanna 5., Tajima K., Tan W-C. Archiving scientific Data. — SIGMOD Conference, 2002. 53. Horrocks /., Parsia В., Patel-Schneider P., Hendler J. Semantic Web architecture: stack or two towers? // Principles and Practice of Semantic Web Reasoning. — 2005. - P. 37-41. 54. Hendler J., Parsia B. XML and the Semantic Web [электронный ресурс]. — http://www.XML-JOURNAL.com. - October, 2002.