Зачем нам нужны пространства имен?
Существует действительно две фундаментальные потребности в пространствах имен:
- Чтобы устранить неоднозначность между двумя элементами, которые имеют одинаковое имя
- Группировать элементы, относящиеся к общей идее, вместе
Итак, эти утверждения немного расплывчаты — давайте приведем здесь несколько примеров:
Для устранения неоднозначности между элементами, которые имеют одинаковое имя
Считают, что:
- В (x) html есть элемент
table
. В XSL-FO также есть элемент с таким же именем. -
a
,title
иstyle
являются элементами как в (x) html, так и в SVG.
Итак, как вы можете отличить title
SVG от (x) HTML?
Группировать элементы, относящиеся к общей идее, вместе
В (x) html table
, style
и элементы регулируются конкретными правилами о том, что требуется, а что может и не может быть включено. Определения, требуемые этими правилами, должны быть включены в одно и то же место.
Так, например, мои собственные данные на основе XML могут иметь правила проверки, и я хочу:
- определить эти правила в том же месте, и
- дифференцировать эти конкретные правила от любого другого набора правил, который я (или кто-то еще) определяю.
Что такое пространство имен?
Пространство имен — это уникальный URI (унифицированный указатель ресурса)
Преимущество этого формата заключается в том, что любой, кто передает XML, может иметь доступ к доменному имени (бит после http: //, но до следующего /). Плохо связываться с чужим доменом (особенно если они не знают, что вы это делаете!).
В документе XML URI связан с префиксом, и этот префикс используется с каждым элементом, чтобы указать, к какому пространству имен принадлежит элемент. Например,
rdf:description xsl:template zblsa:data
В этих примерах
- часть перед двоеточием является префиксом
- часть после двоеточия является локальной частью
- любой префиксный элемент является квалифицированным именем
- любой элемент без префикса является безусловным именем
Как мне использовать пространство имен?
Чтобы использовать пространство имен, вы сначала связываете URI с пространством имен:
<foo:tag xmlns:foo="http://me.com/namespaces/foofoo">.
Это определяет foo
как префикс для пространства имен для этого тега элемента. Атрибут с префиксом xmlns
работает как команда, говорящая «связать следующие буквы с URI». Поскольку ни один правильно сформированный документ не может содержать два идентичных атрибута, часть, которая появляется после двоеточия, останавливает один и тот же префикс, определяемый дважды одновременно.
Определение одного префикса для пространства имен
Вот пример, где мы определяем один префикс для пространства имен:
<foo:tag xmlns:foo="http://me.com/namespaces/foofoo"> <foo:head> <foo:title>An example document</foo:title> </foo:head> <foo:body> <foo:e1>a simple document</foo:e1> <foo:e2> Another element </foo:e2> </foo:body> </foo:tag>
Для всех элементов в <foo:tag>
префикс пространства имен foo
связан с URI пространства имен http://me.com/namespaces/foofoo
.
Определение нескольких префиксов для одного и того же пространства имен
Разные префиксы могут ссылаться на одно и то же пространство имен следующим образом:
<tag> <foo:head xmlns:foo="http://me.com/namespaces/foofoo"> <foo:title>An example document</foo:title> </foo:head> <bar:body xmlns:bar="http://me.com/namespaces/foofoo"> <bar:e1>a simple document</bar:e1> <bar:e2> Another element </bar:e2> </bar:body> <tag>
Определение одного и того же префикса для нескольких пространств имен
Также возможно (хотя и не рекомендуется) для одного и того же префикса ссылаться на разные пространства имен, в зависимости от их контекста:
<myns:html xmlns:myns="http://www.w3c.org/1999/xhtml"> <myns:head> <myns:title>A really bad idea</myns:title> </myns:head> <myns:body> <myns:h1>A really bad idea</myns:h1> <myns:pre> <myns:pre xmlns:myns="http://my.com/namespaces/test-data"> <myns:table> <myns:data> Hello World </myns:data> </myns:table> </myns:pre> </myns:pre> </myns:body>
Примечание: это не очень хорошая идея!
Несколько пространств имен
Если вы используете пространства имен, вам почти наверняка понадобится использовать несколько пространств имен одновременно — так как вы можете объявить более одного пространства имен одновременно?
Что вы делаете, это используете более одного объявления xmlns
, например так:
<foo:tag xmlns:foo="http://me.com/namespaces/foofoo" xmlns:bar="http://me.com/namespaces/foobar" > <foo:head> <foo:title>An example document</foo:title> </foo:head> <bar:body> <bar:e1>a simple document</bar:e1> <bar:e2> Another element </bar:e2> </bar:body> </foo:tag>
Пространство имен по умолчанию
Вопрос: Если вы используете какие-либо пространства имен, должны ли все элементы существовать в пространстве имен?
Ответ: Да, но это не должно быть проблемой!
Допустимо определить пространство имен, которое связано без префикса — это безусловные имена, к которым мы прикасались выше.
Это имеет особое значение для xhtml, так как одно из требований этого языка заключается в том, что xhtml не нарушает HTML — и HTML не понимает префиксы!
Чтобы определить пространство имен по умолчанию, просто выделите xmlns
без префикса:
<xhtml xmlns="http://www.w3c.org/1999/xhtml">
Например:
<html xmlns="http://www.w3c.org/1999/xhtml" xmlns:bar="http://me.com/namespaces/foobar" > <head> <title>An example document</title> </head> <body> <bar:e1>a simple document</bar:e1> <bar:e2> Another element </bar:e2> </body> </html>
Атрибуты и пространство имен
Для любого конкретного элемента атрибут может существовать только один раз. Это делает атрибуты немного отличными от элементов.
Атрибуты могут быть помещены в определенное пространство имен ( <.... myns:myattib="foo" ...>
) или их можно оставить неквалифицированными.
Обычное «правило» для атрибутов — помещать их в пространство имен, только если рассматриваемый атрибут определен конкретным пространством имен (таким как атрибуты xlink или rdf).
Атрибуты, которые не имеют префикса пространства имен, не определяются пространством имен. Обратите внимание, что это не то же самое, что быть в пространстве имен по умолчанию .
Размещение атрибутов в пространствах имен становится важным, только если вы требуете, чтобы ваш документ соответствовал DTD или схеме, которая определяет атрибут как квалифицированный.
Что я должен поместить в конец URI пространства имен?
Ничего!
Хорошо, так что это не очень полезно. Проблема здесь в том, что люди видят URL-адрес, поэтому они хотят указать свой веб-браузер на него, чтобы увидеть, что они получают. Это чисто человеческая вещь и является следствием решения стандартизировать URI для пространств имен.
Процитируем Клода Л. Булларда (из списка рассылки XML-Dev):
Недостатком является смешение имени, местоположения и идентичности, но этот недостаток является основной особенностью, с которой работает WWW, поэтому мы застряли там.
Все упоминания о URN / URI / URL не исключают того простого факта, что если поместить http: // в любое место экрана браузера, система раскрасит его в синий цвет и выставит палец.
Обезьяна ожидает ресурс, и когда он не получает его, это шокирует обезьяну.
Обезьяны не читают спецификации, чтобы понять, почему их не следует шокировать.
Они краснеют и поднимают палец.
Чтобы избежать этого «шокового» фактора, многие люди публикуют документ, описывающий пространство имен для заблудшего зрителя. RDDL (язык описания каталога ресурсов) — это новая идея, которая основывается на этом подходе и в настоящее время появляется из XML-dev.
Дальнейшее чтение
Основные порталы XML
- www.xml.com
- www.xml.org
- www.xml.net (в будущем)
Порталы с информацией о XML