version="1.0">
...
Префиксы, которые были определены в некотором элементе, могут быть использованы в его собственном имени, а также в именах всех элементов, которые включены в него.
Пример
<���ааа:anotherelement/>
...
Принадлежность элементов той или иной схеме определяется не префиксами, а тем, какие уникальные идентификаторы поставлены этим префиксам в соответствие. То есть два элемента с разными префиксами, заданными одинаковыми идентификаторами, будут считаться принадлежащими одной схеме.
Пример
В следующем фрагменте
xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
version="1.0">
...
элементы stylesheetи templateимеют различные префиксы, но, несмотря на это, принадлежат одной и той же схеме.
В одном элементе можно определять несколько префиксов пространств имен. Как правило, при использовании множества префиксов, все они определяются в корневом элементе, а затем используются по всему документу.
Пример
xmlns:aaa="http://www.ааа.com"
xmlns:bbb="http://www.bbb.com"
xmlns:ccc="http://www.ccc.com">
...
Весьма удобной является возможность использования пространства имен по умолчанию. Определение пространства имен в виде
< элемент xmlns="URI">
...
</ элемент >
позволяет опускать префиксы в именах элементов.
Пример
Документ в предыдущем примере может быть переписан следующим образом:
<���ссс:element xmlns:ccc="http://www.ccc.com"/>
...
Обратим внимание, что пространство имен по умолчанию может быть изменено повторным использованием атрибута xmlnsв дочерних элементах.
Пример
Документ
эквивалентен документу
xmlns:aaa="http://www.aaa.com"
xmlns:bbb="http://www.bbb.com"
xmlns:ccc="http://www.ccc.com">
Таким образом, пространства имен — это механизм выделения в тексте XML-документа элементов и атрибутов, принадлежащих различным логическим схемам документов. Более того, термин "пространство имен" часто используется как эквивалент логической схеме документа, например, когда говорят "элемент templateпринадлежит пространству имен XSLT", подразумевается, что элемент templateопределен в языке XSLT и описывается в соответствующей схеме.
Синтаксические правила, которые описывают определения пространств имен, задаются не в спецификации XML, а в другом документе — в технической рекомендации "Namespaces in XML" (пространства имен в XML), которая доступна по адресу http://www.w3.org/TR/REC-xml-names. Для того чтобы отличать эти продукции от продукций языка XML, мы будет давать им номера вида [NS1], [NS2]и так далее.
Продукция NSAttNameописывает имена атрибутов, декларирующих пространства имен:
[NS1] NSAttName ::= PrefixedAttName | DefaultAttName
[NS2] PrefixedAttName ::= 'xmlns:' NCName
[NS3] DefaultAttName ::= 'xmlns'
Имя NCName, которое использовалось в правиле PrefixedAttName, — это имя префикса, который будет использоваться для обозначения принадлежности элементов определенному пространству имен. Это имя отличается от имен, которые отвечают продукции Nameтем, что оно не может содержать двоеточия:
[NS4] NCName ::= (Letter | '_') (NCNameChar)*
[NS5] NCNameChar ::= Letter | Digit | '.' | '-' | '_'
| CombiningChar | Extender
Использование пространств имен значительно изменяет понятие имени. Действительно, если www:template, xsl:templateили просто templateмогут быть одинаковыми именами, то именем в таком случае должна считаться не просто символьная последовательность, которая его составляет, а нечто большее.
Вследствие этого в спецификациях группы XML-языков вводится такое понятие, как расширенное имя, которое состоит из двух частей: локальной части и идентификатора пространства имен, которое соответствует префиксу имени.
Пример
Представим себе элемент вида
Расширенное имя этого элемента будет состоять из локальной, части stylesheetи идентификатора пространств имен http://www.w3.org/1999/XSL/Transform.
Расширенные имена считаются совпадающими, если их локальные части равны и, при этом, они относятся к одному пространству имен.
Префикс в расширенном имени может быть опущен. В таком случае идентификатор пространства имен будет либо выбран по умолчанию (если имеется соответствующее объявление), либо будет нулевым.
Для описания имен элементов и атрибутов, которые должны иметь расширенное представление, используется продукция QName:
Читать дальше