XML пространства имен
Пространства имен позволяют избежать конфликта имен XML элементов.
Конфликты имен
В XML имена элементов определяет разработчик. Часто это становится причиной конфликта имен при попытке одновременного использования нескольких XML документов от разных XML приложений.
Следующий код XML содержит информацию о HTML таблице:
Следующий код XML содержит информацию о столе (предмет мебели), который по англ. тоже table:
Если эти два фрагмента кода XML будут сведены вместе, то возникнет конфликт имен. Так как оба документа содержат элемент , хотя и с разным контентом и значением.
Пользователь или XML приложение не будут знать, каким образом обрабатывать эти различия.
Разрешение конфликта имен при помощи префикса
В XML избежать конфликта имен можно при помощи префикса имени элемента.
Следующий код XML содержит информацию о таблице HTML и о столе:
В этом примере не будет конфликта имен, так как два элемента имеют разные имена.
Пространства имен XML – Атрибут xmlns
При использовании в XML префиксов необходимо определить, так называемое, пространство имен префикса.
Пространство имен определяется благодаря атрибуту xmlns в начальном теге элемента.
В данном примере, атрибут xmlns в теге определяет префиксам h: и f: квалифицирующее пространство имен.
Когда пространство имен определено для какого-то элемента, то все его дочерние элементы с тем же префиксом ассоциируются с его пространством имен.
Пространства имен могут декларироваться либо непосредственно в самом элементе, либо в корневом элементе XML документа:
Замечание: URI пространства имен не используется парсером для получения какой-либо информации. Цель всего этого состоит в том, чтобы дать пространству имен уникальное имя. Тем не менее, часто компании используют пространство имен, как указатель на веб-страницу с информацией об этом пространстве имен.
Унифицированный идентификатор ресурса (URI)
Унифицированный идентификатор ресурса (URI) это символьная строка, идентифицирующая интернет-ресурс.
В наиболее общей форме URI является единым указателем ресурса (URL), который идентифицирует доменный адрес в интернете. Другой, более частный вид URI — единообразное имя ресурса (URN).
В наших примерах мы будем использовать только URL.
Пространства имен по умолчанию
Определение пространства имен по умолчанию позволяет избежать использования префиксов во всех дочерних элементах. Такое определение имеет следующий синтаксис:
Следующий код XML содержит информацию о таблице HTML:
Следующий код XML содержит информацию о предмете мебели — столе:
Реальное использование пространства имен
XSLT — это XML язык, который может использоваться для преобразования документов XML в другие форматы, например, HTML.
Урок 14: Web-стандарты и проверка
В этом уроке мы дадим несколько больше теории HTML.
Что ещё нужно знать о HTML?
HTML можно кодировать несколькими способами. Браузеры также могут читать HTML по-разному. Можно сказать, что в HTML есть много диалектов. Поэтому сайты выглядят по-разному в различных браузерах.
Почти с момента зарождения Internet начались попытки выработать общий HTML-стандарт на World Wide Web Consortium (W3C), который основал Tim Berners-Lee (ага! тот крутой парень, который изобрёл HTML). Но это длинный и долгий путь.
Начиная с версий 4 и 5, Microsoft всё более и более поддерживал HTML-стандарты от W3C. Netscape не занимался разработкой новых версий и продолжал выпускать устаревшую версию 4.
Конец этой истории. Сегодня HTML-стандарты называются 4.01 и XHTML. Теперь уже Internet Explorer занимает свыше 90% рынка. В Internet Explorer тоже есть свои необычные элементы, но он также поддерживает и W3C HTML-стандарты. Так же делают и другие все браузеры, такие как Mozilla, Opera и Netscape.
Круто! Можно, я расскажу ещё кому-нибудь?
Пример 1:
В атрибуте lang вы указываете, на каком языке написан документ. Для этого используется стандарт ISO 639, в котором перечислены коды всех языков мира. В предыдущем примере установлен English («en»).
С помощью DTD браузер точно знает, как он должен читать и отображать ваш HTML. Используйте этот образец как шаблон для ваших будущих HTML-документов.
DTD также имеет важное значение при проверке ваших страниц.
Проверке? Почему и как я должен это делать?
Этот validator полезен не только для выявления ошибок. Некоторые браузеры пытаются автоматически исправлять ошибки кодировщиков и отображают страницу так, как она должна выглядеть (по их «усмотрению»). При этом вы можете никогда не увидеть ошибок в своём браузер. Однако браузеры корректируют ошибки по-разному или могут вообще не показать страницу. Проверщик-validator помогает выявить ошибки, о наличии которых вы, может быть, и не подозревали.
Всегда проверяйте ваши страницы для обеспечения их корректности.
Про xmlns. Часть первая
![]() | ![]() |
![]() | ![]() |
Атрибут version является обязательным, равно как и объявление XSL-неймспейса xmlns:xsl="http://www.w3.org/1999/XSL/Transform" (иначе было бы неясно, где в шаблоне сам XSL-код). А вот зачем нам нужна запись xmlns="http://www.w3.org/1999/xhtml", не очень понятно.
Для начала уясним, что вообще делают эти конструкции, начинающиеся с xmlns. У всесильного W3C на эту тему тоже есть свой документ, озаглавленный «Неймспейсы в XML». Почитав его (перед сном это делать не рекомендуется), мы узнаем, что основной причиной возникновения неймспейсов явилась необходимость отличать обладающие одним и тем же именем, но имеющие разный смысл и предназначение, относящиеся к разным словарям разметки.
Хорошим примером такого разделения может служить как раз милый нашему сердцу XSL. Скажем, элемент имеет неймспейс xsl и является управляющим XSL-кодом, тогда как элемент
неймспейса не имеет и просто отправляется на вывод, несмотря на то что имя у него тоже text.
Чтобы использовать какой-то неймспейс в своем XML (а XSL есть XML), его надо сначала объявить. Продолжая изучать вышеозначенный документ, мы обнаруживаем, что существуют два способа объявления неймспейсов: с префиксом и без префикса.
Форма с префиксом имеет вид:
Здесь префикс — это некоторое внутреннее имя нашего мы можем использовать любой префикс, какой нам нравится. А вот URI — это такая штука, которая фиксируется раз и навсегда, чтобы при виде этого URI все понимали, какой словарь разметки он представляет. Скажем, написал кто-то на заборе http://www.w3.org/1999/XSL/Transform, и каждому ясно — да это же URI XSL-я! Понятно, что при таком подходе все URI должны быть уникальны.
Следует также понимать, что не «ходят» в интернет, чтобы по этому адресу чего-то скачать. Это всего лишь уникальный идентификатор. Однако здесь возникает вопрос: а что же он тогда выглядит как адрес в интернете? Почему вместо http://www.w3.org/1999/XSL/Transform не писать, например, «у-вас-ус-отклеился»? Ответ прост: когда-то условились, что по этому адресу URI в интернете должна висеть маленькая страничка, в двух словах рассказывающая, что это за URI и какой цели служит. И страничка эта предназначена для человека, а не для машины.
Итак, объявив неймспейс с префиксом, мы теперь можем его использовать — писать элементы, имеющие этот неймспейс. Как это делать, читатель наверняка знает:
Но все привыкли использовать xsl — это коротко и удобно.
Переходим к неймспейсу без префикса. Он имеет вид:
Эта конструкция объявляет неймспейс по умолчанию. Он нужен в ситуации, когда при написании элемента мы не указываем префикс, а пишем сразу имя элемента —
А что если неймспейс по умолчанию не объявлен и у элемента нет префикса? Такую ситуацию вэтрицэшники тоже регламентируют: тогда элемент получит неймспейс, не имеющий значения, который называется null.
Следовательно, запись xmlns="http://www.w3.org/1999/xhtml" в начале XSL-шаблона нужна для того, чтобы сообщить XSL-процессору (трансформатору), что все элементы, не имеющие префикса, относятся к этому неймспейсу XHTML-документов. А что это дает? Самое смешное, что ничего особенного.
Все, что произойдет, — это копирование указанного неймспейса в выходной HTML. То есть такой XSL-шаблон:
Итак, берусь утверждать, что при выводе HTML ощутимой пользы от этого xmlns="http://www.w3.org/1999/xhtml" нет. А есть ли вред? Оказывается, небольшой есть — от неаккуратного использования.
Трансформаторы обязаны копировать xmlns в выходной HTML по XSL-спецификации. Дело в том, что трансформатор может генерировать не только HTML, но и произвольный XML (который может быть подвергнут дальнейшей машинной обработке), и в нем нужно сообщить, какому неймспейсу принадлежат элементы, не имеющие префикса. Причем в этом месте действуют определенные правила. В частности, запись:
говорит, что текущий элемент и все его потомки, не имеющие префикса, относятся к неймспейсу http://www.w3.org/1999/xhtml. Это важно. Именно из-за этого в HTML регулярно вылезают эти записи xmlns="http://www.w3.org/1999/xhtml".
Разберемся на примере. Представим, что у нас есть два XSL-шаблона, причем один импортирует другой.
Импортируемый шаблон import.xsl:
Результатом выполнения главного шаблона будет:
Почему посреди нашего HTML вылезли эти xmlns="http://www.w3.org/1999/xhtml", да еще три раза?
Рассмотрим обратную ситуацию, когда в главном шаблоне есть xmlns="http://www.w3.org/1999/xhtml", а в импортируемом — нет. Тогда на выходе мы получим другой сюрприз:
Элемент и все его потомки законно получают XHTML-неймспейс. Но у абзацев-то он null (ибо в их файле import.xsl xmlns не указан), поэтому абзацы бунтуют и говорят нам: «Идите к черту. Не хотим наследовать ваш XHTML. У нас свой неймспейс null». Это выражается в записи xmlns="" у каждого абзаца, которая как раз и означает, что неймспейс этого элемента null.
Вывод: надо или во всех XSL-файлах объявлять неймспейс по умолчанию, или во всех не объявлять. Лично я везде не объявляю — меньше суеты в коде.
В следующей части мы подробнее разберемся в неймспейсах с префиксом.
4. Обработка нескольких пространств имен¶
Пространство имен в XML представляет собой набор имен элементов и атрибутов. Например, в пространстве имен XHTML мы находим имена элементов, такие как body, link и h1, а также имена атрибутов, такие как href и align.
Для простых документов все имена элементов и атрибутов документа могут находиться в одном пространстве имен. В целом, однако, XML-документ может включать имена элементов и атрибутов из многих пространств имен.
4.1. Глоссарий терминов пространства имен¶
4.1.1. URI: Universal Resource Identifier¶
Формально каждое пространство имен называется URI или универсальным идентификатором ресурса. Хотя URI часто выглядит как URL-адрес, существует важная разница:
4.1.2. NSURI: Namespace URI¶
Не все URIs определяют пространства имен.
The W3C Recommendation Namespaces in XML 1.0 предпочитают термин имя пространства имен для более широко используемого NSURI.
Например, здесь есть NSURI, который идентифицирует «XHTML 1.0 Strict» диалект XHTML:
4.1.3. Пустое пространство имен¶
В рамках данного документа ни один набор имен элементов и атрибутов не может быть отнесен к определенному пространству имен и соответствующему NSURI. Эти элементы и атрибуты, как говорят, находятся в пустом пространстве имен.
Это удобно для документов, чьи имена элементов и атрибутов находятся в одном пространстве имен. Это также характерно для неформальных и экспериментальных приложений, где разработчик не хочет беспокоиться о том, чтобы определить NSURI для пространства имен или еще не создал его.
Например, многие страницы XHTML используют пустое пространство имен, потому что все имена находятся в одном пространстве имен и потому, что браузеру не требуется NSURI, чтобы отображать их правильно.
4.1.4. Clark notation¶
Поскольку одно и то же имя может встречаться в разных пространствах имен внутри того же документа, при обработке документа мы должны иметь возможность их различать.
Нотация Кларка фактически не появляется в исходном файле XML. Она используется только в представлении ElementTree документа.
4.1.5. Предок (Ancestor)¶
В понятие предок элемента включают его непосредственного родителя, родителя родительского элемента и т.д. до корня дерева. У корневого узла нет предков.
4.1.6. Потомок (Descendant)¶
Потомки элемента включают его прямых детей, детей его детей и т.д. до листьев дерева документа.
4.2. Синтаксис документов с несколькими пространствами имен¶
Внешняя форма XML-документа использует префиксы пространства имен для различения имен из разных пространств имен. Каждый NSURI каждого префикса должен быть определен внутри документа, за исключением пустого пространства имен, если оно есть.
Вот небольшой фрагмент, чтобы показать вам общую идею:
inline элемент находится в пространстве имен XSL-FO, которое в этом документе использует префикс пространства имен fo:. Элемент copy-of находится в пространстве имен XSLT, префиксом которого является «xsl:».
В вашем документе вы должны определить NSURI, соответствующий каждому префиксу пространства имен. Это можно сделать несколькими способами.
Например, любой элемент может иметь атрибут «xml: id», который служит для идентификации уникального элемента в документе.
Вот небольшой правильный XHTML-файл со всеми украшениями, рекомендованными организацией W3C:
Атрибут xmlns элемента html указывает, что все его дочерние элементы находятся в пространстве имен XHTML 1.0 Strict.
Атрибут xml: lang = “en” указывает, что документ использует английский язык.
Вот более подробный пример. Это корневой элемент таблицы стилей XSLT. Префикс «xsl:» используется для элементов XSLT; префикс «fo:» используется для элементов XSL-FO; и третье пространство имен с префиксом «date:» также включено. В этом документе не используется пустое пространство имен.
4.3. Карты пространства имен¶
Карты пространства имен используются в нескольких целях.
Например, в конце раздела 4.2 «Синтаксис документов с несколькими именами» есть тег начала xsl: stylesheet, который определяет xsl: как префикс для пространства имен XSLT, fo: для пространства имен XSL-FO и date : для date-and-time. Вот карта пространства имен, которая описывает те же отношения префиксов к NSURI:
Что понимается под пространством имён в спецификации HTML5?
Выдержка из спецификации:
In HTML documents, elements in the HTML namespace may have an xmlns attribute specified, if, and only if, it has the exact value «http://www.w3.org/1999/xhtml». This does not apply to XML documents.
Переводится примерно: «В HTML документах элементы в HTML-пространстве имён могут иметь атрибут xmlns, если он имеет точное значение «http://www.w3.org/1999/xhtml». «
И тут я понял, что вообще ничего не понимаю. Я думал, что для html нет понятия пространство имен.
Ссылка HTML пространство имен в спецификации ведет на список:
И я совсем не могу понять, что такое имеется ввиду под пространством имен в данной спецификации? Пространство имен html ведет вообще на xhtml спецификацию. Причем тут html5 и xhtml? И как это связано с пространством имен?
Что значит фраза «элементы в HTML-пространстве имён могут иметь атрибут xmlns»? В html пространстве имен это где? И как работает этот атрибут в html5?
1 ответ 1
Про атрибут xmlns
По поводу xmlns, в том же тексте, сразу после приведённой в вопросе цитате сказано следующее:
Note: In HTML, the xmlns attribute has absolutely no effect. It is basically a talisman. It is allowed merely to make migration to and from XHTML mildly easier.
Заметка: В HTML, xmlns атрибут не имеет никакого эффекта. Это просто талисман. Он лишь позволяет проще выполнить преобразования в и из XHTML документов.
С этим разобрались, xmlns в HTML нам не потребуется. Его конечно можно использовать для HTML-элементов, но это не имеет смысла, так как для всех структур в HTML документе уже есть предустановленные значения «пространства имён», список которых приведён в вопросе, и изменить их на другие значения никто не позволит. Проще говоря, нижепревидённые примеры равнозначны:
А вот так уже не получится, так как xmlns попросту игнорируется, и html всё равно будет располагаться в пространстве имён «http://www.w3.org/1999/xhtml», как было сказано выше.
Про пространство имён
По аналогии с именами классов, пакетов и т.п из языков программирования, пространство имён позволяет отличить один элемент от другого, когда они имеют одинаковое название, но принадлежат разным пространствам имён. Где это может произойти в HTML? Например когда мы используем svg в html:
И нам потребовалось изменить размер шрифта у ссылки в svg. Просто написать в стилях a < font-size: 1.5em >уже не получится, так как это правило применится и к обычной ссылки тоже. Вот здесь на помощь приходят возможности CSS по работе с пространствами имён. Для этого в CSS выполним такие действия:
1) Используя ключевое слово @namespace указываем наименование «приставки» пространства имён, с каким мы будем иметь дело:
Заметка: адрес пространства имён для SVG взят из спецификации, а вместо svg можно использовать другое наименование.

/cc1.gif)
/cc3.gif)
/cc2.gif)




