Почти все основанные на SGML приложения содержат в себе массу таинственных, но от этого не менее интересных, вещей, о которых можно часами рассказывать знакомым программистам или девушкам. И те, и другие такие рассказы о скрытых возможностях различных языков разметки слушают довольно внимательно, стараясь не отвлекаться на внешние раздражители. А всё почему? Потому что вдохновители SGML и его потомков сделали всё возможное, чтобы их формат играл не только роль обычного связующего между человеком и машиной, но и являлся средством вдохновения на различные приятные подвиги. Именно поэтому Web-инженеров можно называть азартными романтиками.
Многие Web-разработчики, достигшие третьего уровня сложности игры в HTML (кто уже перешёл или начинает свой переход на строгий XHTML), могут задать вполне логичный вопрос: что это за атрибут такой, xmlns, который можно встретить на самой верхушке документа? Должно быть интересно, что он обозначает и зачем используется в XHTML. Давайте разбираться.
Природа загадочного атрибута
Атрибут xmlns — что же это такое? Этот атрибут можно встретить не только в XHTML, но и в его ближайшем родственнике: XML. Причём, как мы знаем, XML, в отличие от XHTML, не определяет никаких обязательных атрибутов и элементов, предоставляя инженеру полную свободу действий. Однако, даже в XML рассматриваемый нами атрибут выполняет особую роль, хоть он и не обязателен для определения в документе. В чём же заключается роль этого атрибута?
Представьте себе книжную полку, где каждое отделение содержит книги определённого стиля, жанра или автора. Всё на этой полке приведено в полный порядок и гармонию. Это облегчает читателю поиск любимой книги, облегчает ему поиск конкретного автора или выбор определённого жанра из всей коллекции. Особенно такая систематизация помогает при наличии немалого числа книг. Дома громадных книжных коллекций можно редко где увидеть, а вот в библиотеках — это единственный способ держать под контролем армию знаний. Представьте себе библиотеку, где всё было бы смешано между собой, книги сложены в кучу да ещё и в разных местах. Как долго вы бы искали то, зачем пришли?
Атрибут xmlns играет роль книжного стеллажа: он разделяет различные классы элементов и атрибутов, чтобы их легче было применять в документе, чтобы не происходило путанницы. Такая практика применяется не только в языках разметки: можно привести ещё несколько удачных реализаций подобной задумки. Разработчики конкретных языков программирования, например, C++, Java, Ruby или Python, встречаются с понятием «пространство имён» практически каждый день. Причём, в них он играет такую же роль, что и в XML.
Однако почему xmlns называется именно так? Всё просто: xmlns обозначает XML Namespace, то есть «Пространство имён XML».
Определение пространства имён
Определить пространство имён мы можем на любом элементе документа; его эффект будет распространяться на все элементы, вложенные в него и на сам этот элемент. У одного элемента мы можем определять сколь угодно пространств имён. Существует два способа определения пространства имён: префиксный и безпрефиксный.
- Префиксный — это такой способ определения пространства имён, при котором мы задаём его имя. При использовании такого пространства имён всегда необходимо применять в дальнейшем расширенний вид имени элемента (или атрибута), чтобы указать на то, к какому пространству имён относится этот элемент (атрибут). Для определения префиксным способом используется следующая конструкция: xmlns:имя_пространства_имён="URI_пространства_имён";
- Безпрефиксный способ подразумевает определение пространства имён по умолчанию для имён элементов (и атрибутов), записанных в обычной форме (это и есть та повседневная форма записи имён элементов и атрибутов, которую мы чаще всего используем). Его запись выглядит так же, как и при использовании префиксного способа, но без имени_пространства_имён, то есть: xmlns="URI_пространства_имён".
В каждом из этих способов вы могли видеть понятие URI_пространства_имён в качестве значения атрибута xmlns (или xmlns:имя_пространства_имён). Это самый обычный URI, который соответствует определяемому нами пространству имён. Добавляя в документ новое пространство имён, мы делаем соответствующую привязку всех элементов и атрибутов, использующих его, к определённому адресу в Интернете. Этот адрес указывает на Web-страницу, на которой расположена информация о том, какие элементы и атрибуты может включать в себя данное пространство имён. Совершенно необязательно, чтобы на той странице был страшный документ для обработки машинами; напротив: информация, представленная в нём, должна быть понятна человеку, потому что прежде всего люди используют различные пространства имён при разметке тех или иных документов.
Одно правило должно выполняться для такого типа определений пространства имён: URI должен быть уникален и не может быть пустым (несмотря на то, что пустая строка — это валидный URI). Это значит, что каждое отдельное пространство имён должно быть описано на своей собственной странице, чтобы не возникало никаких пересечений между разными сущностями.
Существует несколько ограничений, накладываемых на добавление новых пространств имён.
- Пространство имён с именем xml является зарезервированным и используется по умолчанию для всех XML-документов. Это значит, что если вы создали XML-документ и не определили нигде свои пространства имён, то весь документ использует пространство имён xml;
- Пространство имён с именем xmlns также является зарезервированным, так как с помощью него мы определяем другие пространства имён. По умолчанию, атрибут xmlns как раз и является членом данного пространства имён.
Теперь разберёмся с расширенным видом имени элемента. Обычно, мы встречаемся с такой записью элемента:
Если мы определяем новое пространство имён префиксным способом, то запись имён элементов и атрибутов приобретает следующий вид:
В этом случае мы к имени каждому элемента и атрибута добавляем префикс, состоящий из имени пространства имён и двоеточия. Разумеется, необязательно, чтобы элемент и все его атрибуты были записаны в одном и том же пространстве имён. Элемент может использовать одно пространство имён, атрибуты — другое, а могут и не использовать вовсе.
В вышеприведённом примере элемент element и атрибут attr_second используют пространство имён по умолчанию, а атрибут attr_first — пространство имён namespace.
Применение пространств имён
Данное полезное свойство XML следует применять тогда, когда очевидно, что в документе будут использованы сущности разных видов. Если используемые элементы в документе совершенно рознятся по своему предназначению, либо их парсинг будет происходить по разным критериям, то следует разграничить их в разные пространства имён.
При обработке документов с использованием пространств имён машинными средствами, можно использовать механизмы для предупреждающего вычленения элементов, соответствующих конкретным пространствам имён, чтобы облегчить последующую (возможную) процедуру обработки дерева XML-документа. Такая возможность очень полезна при построении шаблонизаторов, основанных на XML: можно разграничить элементы шаблонизатора и элементы интерфейса, тогда, вкупе с исчерпывающей документацией по каждому из пространств имён, получится отличная дифференцированная система обработки сложных структурированных XML-шаблонов.
Давайте посмотрим на простые примеры. Для начала создадим простой XML-документ:
Мы создали простой структурированный словарик определений. По умолчанию, мы не определили смысл каждого из наших тегов, потому что не задали пространство имён по умолчанию. Такая информация полезна прежде всего для редакторов подобных документов, так как из пространств имён они могут получить документацию по применяемой разметке. Информация может быть обычной XHTML-страницей, рекомендацией или даже статьёй, где рассказывается об использовании элементов и атрибутов данного пространства имён.
Теперь любой сможет пройти по этой ссылке и просмотреть информацию обо всех элементах, используемых в документе. Теперь усложним ситуацию: представим, что нам понадобилось размечать описание каждого слова XHTML-разметкой. Просто вписать имена соответствующих элементов мы не можем, поскольку мы определили собственное пространство имён для элементов без префиксов (даже если бы мы этого не сделали, по умолчанию для таких элементов используется пространство имён xml). Мы с этой проблемой можем спокойно, без нервов, справиться:
Заметьте, что теперь мы разметили наши описания с помощью HTML. Обратите внимание на то, что и атрибуты, которые используются в XHTML, мы также записываем с префиксами. Теперь, если мы будем писать парсер, нам будет легко дифференцировать структурные и визуальные элементы документа. А теперь мы добавим ещё одно пространство имён, но уже к другому элементу, и определим внутреннюю структурную ссылку одного понятия на другое.
Теперь при обработке документа и реализации соответствующего алгоритма, мы можем создавать ссылки с одного слова на другое, или объединять слова в целые смысловые группы.
XHTML и пространство имён
Web-разработчики, использующие XHTML, могли видеть этот загадочный атрибут в самом начале документа. Возьмём для изучения первые две строчки текущего документа:
Первая строка — это определение типа документа, а вторая — это корневой элемент этого же документа. Корневой элемент содержит искомое определение пространства имён. Здесь он написан в безпрефиксной форме, то есть все элементы документа — это XHTML-элементы (это понятие раскрывается теперь просто чудесно: XHTML-элементы — это элементы, которые определены в соответствующем пространстве имён XHTML. Девушки будут в восторге!). При использовании сторонних элементов или других пространств имён, валидатор должен выдать ошибку. В первом случае он сделает это, потому что набор используемых элементов определён в DTD, привязанном к документу. Во втором случае это произойдёт, потому что других пространств имён не определено.
Заметьте, что в XHTML определены два атрибута из пространства имён xml, один из которых вы можете видеть в примере выше — xml:lang. Не удивляйтесь: если мы определили пространство имён по умолчанию для данного элемента и всех его потомков, то пространство имён xmlns:xml никуда не делось! Записывают данные атрибуты с префиксом для того, чтобы удовлетворить требованиям применения пространств имён и чтобы не было конфликтов с определением одинаковых по именам атрибутов в разных пространствах имён. Второй подобный атрибут в XHTML вы можете обнаружить самостоятельно в текстах DTD.
Послесловие
Некоторые очень сильно ругают теорию пространств имён в XML, находя её слишком избыточной и странной. Автор считает, что такое решение — это самое изящное решение, которое вообще можно было придумать для XML и его потомков и братьев, так как оно хорошо зарекомендовало себя и в других областях не только разработки, но и обычной жизни. Как уже было сказано ранее много раз, упорядочение и систематизация никогда не играли против человека, а всегда помогали ему выжить под натиском суровых реалий окружающего хаоса. На этой философской ноте меня вынуждают остановиться.
Если вам захочется технических подробностей об этом явлении, обратитесь к соответствующей рекомендации W3. До новых встреч и удачных вам пространств!