Тег HTML, атрибут xmlns

Атрибут xmlns

Используется в XHTML для объявления пространства имен — совокупности наименований тегов и атрибутов предназначенных для сохранения уникальности имен. Значением атрибута xmlns выступает адрес файла объявляющего требуемое пространство имен, для XHTML значение всегда равно http://www.w3.org/1999/xhtml . Этот атрибут также является частью синтаксиса XML, поэтому может использоваться для добавления префикса, чтобы объявить дополнительное пространство имен для документа. К примеру xmlns:my задает адрес файла для элементов с префиксом my .

Синтаксис

Значения

В качестве значения указывается полный адрес документа с описанием пространства имен. Локальный путь и пустая строка недопустима. Для XHTML значение всегда http://www.w3.org/1999/xhtml .

Значение по умолчанию

Обязательный атрибут

В HTML нет, в XHTML обязателен.

      

Корректный XHTML-документ.

Не выкладывайте свой код напрямую в комментариях, он отображается некорректно. Воспользуйтесь сервисом cssdeck.com или jsfiddle.net, сохраните код и в комментариях дайте на него ссылку. Так и результат сразу увидят.

Типы тегов

HTML5

Блочные элементы

Строчные элементы

Универсальные элементы

Нестандартные теги

Осуждаемые теги

Видео

Документ

Звук

Изображения

Объекты

Скрипты

Списки

Ссылки

Таблицы

Текст

Форматирование

Формы

Фреймы

Источник

14 июня 2011

Корневым элементом XSL-шаблона является , и во многих случаях он выглядит так:

Атрибут 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-коде, когда хотят использовать какой-то XSL-элемент, например . Как я уже сказал, префикс может быть любым, поэтому можно писать и так:

Но все привыкли использовать xsl — это коротко и удобно.

Переходим к неймспейсу без префикса. Он имеет вид:

Эта конструкция объявляет неймспейс по умолчанию. Он нужен в ситуации, когда при написании элемента мы не указываем префикс, а пишем сразу имя элемента — . То есть элемент, не имеющий префикса, считается принадлежащим к неймспейсу по умолчанию.

А что если неймспейс по умолчанию не объявлен и у элемента нет префикса? Такую ситуацию вэтрицэшники тоже регламентируют: тогда элемент получит неймспейс, не имеющий значения, который называется null.

Следовательно, запись xmlns="http://www.w3.org/1999/xhtml" в начале XSL-шаблона нужна для того, чтобы сообщить XSL-процессору (трансформатору), что все элементы, не имеющие префикса, относятся к этому неймспейсу XHTML-документов. А что это дает? Самое смешное, что ничего особенного.

Все, что произойдет, — это копирование указанного неймспейса в выходной HTML. То есть такой XSL-шаблон:

Это, конечно, круто, и этого даже требует XHTML-спецификация, но в жизни от этого ни холодно ни жарко. Другое замеченное изменение в поведении трансформатора: если выставлен , то при отсутствии неймспейса по умолчанию выходят незакрытые теги ( ). Но при xmlns="http://www.w3.org/1999/xhtml" теги начинают закрываться. Однако если кто-то думает, что сайт с валидным HTML работает лучше, чем с невалидным, то ему самое время встать и выйти. Меня это сильно раздражает, ведь сайты делаются для людей, а не для валидатора.

Итак, берусь утверждать, что при выводе 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:

  

Billie Jean is not my lover

She's just a girl who claims that I am the one

But the kid is not my son

Результатом выполнения главного шаблона будет:

    

Billie Jean is not my lover

She's just a girl who claims that I am the one

But the kid is not my son

Почему посреди нашего HTML вылезли эти xmlns="http://www.w3.org/1999/xhtml", да еще три раза?

Сначала главный шаблон выводит элементы , и . В главном шаблоне нет объявления неймспейса по умолчанию (он null), поэтому никаких xmlns у элемента тоже нет. Но дальше внутри вызывается шаблон name="lyrics", который находится в другом файле import.xsl. И вот у негó уже есть объявление неймспейса по умолчанию, которое действует на все элементы, выводимые в коде этого файла import.xsl. Поэтому при выводе абзацев нам и сообщается, что у них неймспейс http://www.w3.org/1999/xhtml, иначе они примут неймспейс своего родителя , который равен null. Это произошло с каждым абзацем, так как они вышли братьями.

Рассмотрим обратную ситуацию, когда в главном шаблоне есть xmlns="http://www.w3.org/1999/xhtml", а в импортируемом — нет. Тогда на выходе мы получим другой сюрприз:

    

Billie Jean is not my lover

She's just a girl who claims that I am the one

But the kid is not my son

Элемент и все его потомки законно получают XHTML-неймспейс. Но у абзацев-то он null (ибо в их файле import.xsl xmlns не указан), поэтому абзацы бунтуют и говорят нам: «Идите к черту. Не хотим наследовать ваш XHTML. У нас свой неймспейс null». Это выражается в записи xmlns="" у каждого абзаца, которая как раз и означает, что неймспейс этого элемента null.

Вывод: надо или во всех XSL-файлах объявлять неймспейс по умолчанию, или во всех не объявлять. Лично я везде не объявляю — меньше суеты в коде.

В следующей части мы подробнее разберемся в неймспейсах с префиксом.

Источник

What does "" do?

Everything works fine. And when I don't, CSS "messes" up, everything becomes different and layout becomes "ugly". How can this line solve all the problems?!

Are you sure it's not the line above that one that's making the difference? What browser are you testing with?

@hey: So let me get this straight: If your first two lines are - then everything works fine. But if your first two lines are , then everything is broken? Is that the case? If so, it's umm.. not good.

What I think was actually going on was this: The specified HTML 5 and the document isn't HTML 5. Adding the HTML tag above it didn't get it processed as XHTML -- it got it processed as HTML 4 (Quirks Mode). The xmlns line was ignored, as was the HTML 5 doctype and the extra element.

4 Answers 4

Usually a declaration is used to distinguish between versions of HTMLish languages (in this case, HTML or XHTML).

Different markup languages will behave differently. My favorite example is height:100% . Look at the following in a browser:

XHTML

. and compare it to the following: (note the conspicuous lack of a declaration)

HTML (quirks mode)

You'll notice that the height of the table is drastically different, and the only difference between the 2 documents is the type of markup!

That's nice. now, what does do?

That doesn't answer your question though. Technically, the xmlns attribute is used by the root element of an XHTML document: (according to Wikipedia)

The root element of an XHTML document must be html , and must contain an xmlns attribute to associate it with the XHTML namespace.

You see, it's important to understand that XHTML isn't HTML but XML - a very different creature. (ok, a kind of different creature) The xmlns attribute is just one of those things the document needs to be valid XML. Why? Because someone working on the standard said so 😉 (you can read more about XML namespaces on Wikipedia but I'm omitting that info 'cause it's not actually relevant to your question!)

But then why is fixing the CSS?

If structuring your document like so. (as you suggest in your comment)

. is fixing your document, it leads me to believe that you don't know that much about CSS and HTML (no offense!) and that the truth is that without it's behaving normally and with it's not - and you just think it is, because you're used to writing invalid HTML and thus working in quirks mode.

Источник

Читайте также:  Определить сегодняшнюю дату python
Оцените статью