xmlhack.ru logo
>> статьи на xmlhack.ru

Трещины в фундаменте

Автор: Мика Дубинко
Перевод: А.Скробов
Опубликовано на XML.com (08.11.2006, англ.): http://www.xml.com/pub/a/2006/11/08/cracks-in-the-foundation.html
Опубликовано на xmlhack.ru (10.12.2006, рус.): http://xmlhack.ru/texts/06/cracks-in-foundation/cracks-in-foundation.html
В закладки:   Del.icio.us   reddit

Последняя неделя октября была не самой лёгкой для Рабочей группы по HTML в составе W3C. Сначала в одном из блогов раскритиковали их работу с пространствами имён в XML, что привело к официальному протесту. Вдобавок к этому, Тим Бернерс-Ли написал в своём блоге, что поручит «постепенное» усовершенствование HTML новым, отдельным Рабочим группам по HTML и веб-формам — прекратив ту работу, которую ведёт существующая сейчас группа. (Далее мы вернёмся к этой теме.) Как и всегда, в разделе «досадные недостатки XML» мы стремимся развить обсуждение вопросов, связанных с XML, оспаривая укоренившиеся взгляды на эти вопросы. В этой статье мы заглянем вглубь, в самое сердце проблем, связанных с пространствами имён в XML; приглашаем вас присоединиться.

Техническая проблема, ставшая камнем преткновения, относится к приёму, называемому схемой-хамелеоном, — т.е. к возможности элементов общего словаря использоваться более чем в одном пространстве имён. В данном случае речь идёт об элементах XForms, которые можно использовать в XHTML без дополнительного указания пространства имён. Действительно, этот приём — камень в огород сторонников использования пространств имён для объявления уникальных элементов. Один из блоггеров пишет:

Если вы верите, что в мире XML есть хотя бы одно более важное и безусловное требование, чем требование корректного использования пространств имён: вы, очевидно, просто не понимаете XML.

Заявление в том же духе есть в книге Майкла Фитцджеральда «O'Reilly's XML Hacks» в разделе, посвящённом пространствам имён (хак #59):

Хотя это и спорное средство, но пространства имён в XML абсолютно необходимы для работы с реально используемыми XML-документами.

Действительно, средство спорное. Но почему оно «абсолютно необходимо»? Ко многим утверждениям такого рода относятся как к непреложной аксиоме. Но вместо того, чтобы следовать им не глядя, лучше попытаемся обсудить их применимость в конкретных случаях.

Введение в Пространства имён в XML

Практически любой современный справочник по XML включает в себя материал о пространствах имён, чтобы помочь новичкам разобраться в этом порой путающем предмете. Новичкам для этого нужны примеры — прежде всего, примеры задач, ради решения которых пространства имён и были включены в XML. Давайте посмотрим, какие примеры приводятся в реальных книгах, стоящих у меня на полке.

В уже упомянутом разделе о пространствах имён в XML Hacks, что интересно, даже ни разу не приводятся примеры документов с несколькими пространствами имён.

В третьей редакции отличной книги Эллиота Расти Гарольда и В. Скотта Минса «XML. Справочник» целая глава посвящена пространствам имён. В примере, открывающем главу, используется вымышленный каталог на «языке разметки картин», в котором перегружены элементы с названиями title, date и description. Но даже при всём этом элементы description совпадают по назначению и типу своего содержимого; различие проявляется только в контексте их использования — один элемент задаёт описание страницы, другой — описание картины.

Ещё в одной пользующейся уважением книге, «Профессиональная разработка с использованием XML и Apache» Тэда Льюнга, речь о пространствах имён идёт уже на третьей странице. На каком примере? Для словаря Apache-XML-Book, где «можно легко представить себе, что имя какого-нибудь элемента, например title или author, уже использовано в другой XML-грамматике — скажем, для музыкальных CD».

Дело здесь не в том, чтобы критиковать книги названных авторов. Наоборот: именно опираясь на эти замечательно написанные книги, я хочу высказать своё основное утверждение — наверное, что-то не так с самой постановкой задачи, раз сторонники некой технологии вынуждены прибегать к очевидно надуманным примерам для оправдания её существования.

На ваших книжных полках бесчисленное множество таких же надуманных примеров. Вы можете оставить внизу статьи комментарий, и привести там ваши любимые примеры — будь они удачные или нет. Но уже ясно, что для этой непреложной основы XML-обработки нелегко найти убедительный, жизненный пример задачи.

Надолбы по дороге к признанию

К концу 1990-х мир языков разметки расцвёл. Недавно вышла Рекомендация W3C, определяющая XML, а совсем только что — Рекомендация, касающаяся Пространств имён в XML. Взятые вместе, они были готовы ввести мир в новую эру языков разметки со строгим контролем корректности, оставив позади дурные привычки HTML-писателей прошлого. Но к несчастью, во многих ранних реализациях пространств имён в XML обнаруживались несоответствия со спецификацией W3C.

Особенно неудачной была ситуация с Internet Explorer 5. Тим Брей пишет в 1999 г. в своей статье:

То, что нужно сделать — это объявить префикс пространства имён, и этот префикс должен быть html — другие названия не сработают! Хотя его нужно объявить, нет никакой разницы, какому конкретному пространству имён этот префикс будет соответствовать (посмотрите HTML-код этой страницы, и вы поймёте, о чём речь). Это жуткое нарушение буквы и духа спецификации на пространства имён, и можно было бы предположить, что в Microsoft умудрились просто не понять, что такое пространства имён, — но мы знаем, что они всё это понимают. Вот чудеса.

Дальше события развивались в том же духе. Даже несколько лет спустя, в 2002 г., Бен Хаммерсли писал о проблемах с пространствами имён, относящихся к спецификации RSS 2.0 и усугублённых небрежностью в пакете Дейва Вайнера «Radio» — опорной реализации этой спецификации. В чём состоят проблемы?

Всё потому, что — как и многие другие люди — он забыл, что префикс пространства имён может меняться. Надо, чтобы XML-парсер считал префикс всего лишь ссылкой на URI; только на URI и нужно обращать внимание.

Даже и сейчас представление о произвольно меняющемся соответствии между коротким префиксами и полными URL остаётся для многих туманным и неинтуитивным. Предлагаю вам оставить внизу комментарий с собственными примерами по этому поводу.

Путаница

Дальнейшее развитие пространств имён в XML привело к непрестанной путанице среди пользователей языков разметки. Например, префиксы пространств имён плохо совместимы с DTD, которые, хотя и не вошли в моду, всё равно остаются составной частью XML, задействованной при любом применении в XML именованных сущностей или DOCTYPE. Другими словами, они имеют значение для практически любого веб-разработчика.

К чему относится объявление пространства имён — к самим элементам или их атрибутам? Ответ на этот вопрос — «и так и эдак», и отдельные тонкости до сих пор обсуждаются в рассылках. Рон Бурре осветил этот вопрос в числе других в своей замечательной статье «Рассеем мифы о пространствах имён», также публиковавшейся на этом сайте. В конце концов оказалось, что атрибуты нельзя отнести к конкретному пространству имён без явного указания перед ними префикса — независимо от того, возникают или нет при этом неоднозначности. Позже это решение вызвало новые проблемы.

Ещё одно больное место пространств имён — это их «имена», которые выглядят как обычные URL, добавляют целый вагон этих URL к спецификациям, и вызывают у многих новичков любопытство: что будет, если зайти по такому URL веб-браузером. Это старый вопрос, и мы не станем здесь к нему возвращаться. Но путаница, вызванная непосредственно спецификацией на Пространства имён в XML — это только начало.

Удар рикошетом

QNames: о чём вам говорит это слово? В спецификации на Пространства имён в XML были определены QNames («квалифицированные имена»), но не было ни слова об их использовании в содержимом XML-документа. Они появились вместе с XPath 1.0, когда потребовался способ ссылаться на имена элементов и атрибутов. Тогда решили, что идентичный внешний вид XPath-идентификаторов и элементов, на которые они ссылаются, — это самый разумный способ ссылаться на двухчастные имена, где одна из частей — на самом деле ссылка на третье, более длинное имя. Однако со временем такой подход перестал казаться оправданным; его сравнили с «использованием TCP-пакетов как разделителей в протоколе уровня приложения». И тем не менее, этот не самый удачный подход прочно укоренился в XML-словарях — по крайней мере в тех, в которых используется XPath. Видно, что своим происхождением данная проблема также обязана пространствам имён.

Спецификация на XML Schema, Часть 1, многими считается чересчур сложной, в том числе и из-за использования QNames в содержимом документа. Я пытался сосчитать, сколько раз в этой спецификации встречаются формы словосочетания «пространство имён», и бросил где-то на четвёртой сотне. Насколько проще была бы спецификация без всей этой пространство-именной неразберихи?

Ещё есть XLink, бывший некогда многообещающей ветвью XML-технологий. Но XLink не удовлетворял ключевому требованию:

Должно быть возможно применить семантику XML-ссылок к существующим документам, изменив лишь их DTD, и не требуя изменения содержимого самих документов.
Например, предоставляя необходимую информацию в определении элемента (в DTD), такую, как атрибут ROLE по умолчанию. Это обеспечит возможность наложения семантики XML-ссылок на крупные наборы XML-документов без необходимости изменения самих этих документов.

Этот конфликт был вызван синтаксическими ограничениями, связанными с использованием пространств имён: оказалось невозможным определить XLink как отдельный словарь, в собственном пространстве имён, чтобы он при этом соответствовал приведённому требованию.

Но даже и тогда, когда словари разграничены пространствами имён, никто не гарантирует возможность их совместного использования. Уже хотя бы из-за правил видимости люди станут изобретать весь словарь по-новой. У нас в W3C уже есть html:p и speech:p для обозначения абзацев, где префиксы html и speech соответствуют «именам пространств имён» спецификаций на XHTML и Язык разметки синтеза речи (SSML), соответственно. (Я уже не упоминаю о wml:p.) В словарях многих языков разметки для якорей используются элементы a — сюда относятся XHTML, SMIL и ряд не относящихся к W3C языков. Так что проблема пространств-хамелеонов, с которой началась статья, уже давно назревала. Если рассмотреть её всю в целом, поражаешься, сколько времени уже потрачено на обсуждение перечисленных вопросов группами по разработке и стандартизации языков разметки.

И что теперь?

Есть ещё несколько жизненных примеров, которые придётся рассмотреть в отдельной статье, — например, реакцию мобильной промышленности на пространства имён, и рассмотрение непрерывного потока предложенных альтернатив. Если рассматривать все приведённые здесь возражения по одному, то ни одно из них не представляется крайне существенным; но взятые вместе, они указывают XML-разработчикам, что им нужно пересмотреть не только своё отношение к HTML, но и к пространствам имён вообще.

Что было бы в мире XML без пространств имён, либо с менее обременительной их версией? Docbook и HTML остались бы без изменений. Более новые языки, такие как SVG, слегка отличались бы в мелочах, но остались в целом те же. Главный вопрос — что стало бы с составными документами? Хотя тяжело вообразить ситуацию ещё более плачевную, чем ту, что мы имеем сейчас.

До сих пор ещё не было официальных объявлений от W3C на ту же тему, что заметка в блоге Тима Бернерса-Ли. Тем не менее, отрадно видеть такую решительность при вынужденной смене курса. Будем надеяться, что эта решительность доходит достаточно глубоко, до самого фундамента, — и что пространства имён также подвергнутся пересмотру: иначе противоречия между философией «постепенности» в HTML 4 и отношением к пространствам имён в XML будут только обостряться.

Официальный протест, упомянутый в начале этой статьи, завершается следующими словами:

Если мы собираемся менять пространство имён под каждый новый внешний язык, то можно было просто не заводить себе собственное пространство имён.

На самом деле, это не такая уж плохая альтернатива.

Разоблачение: автор этой статьи — бывший редактор в составе Рабочих групп по XForms и HTML, и один из авторов книги XML Hacks. Эта статья была им составлена в HTML без пространств имён.



XML.com Copyright © 1998-2007 O'Reilly Media, Inc.
Перевод: xmlhack.ru Copyright © 2000-2007 xmlhack.ru