XML Пространства имен по умолчанию для неквалифицированных имен атрибутов? - PullRequest
26 голосов
/ 22 июля 2010

Я пытаюсь понять правильную интерпретацию определения "Пространства имен в XML 1.0 (третье издание)" для пространств имен неквалифицированных атрибутов.

"Имя пространства имен для имени без префикса всегда не имеет значения."

и позже в том же разделе:

"Значение атрибута в объявлении пространства имен по умолчанию МОЖЕТ быть пустым. Это имеет тот же эффект в пределах области объявления, что пространство имен по умолчанию отсутствует."

Так что, если я хочу объявить пространство имен по умолчанию для элемента (и его дочерних элементов), должен ли я также объявить отображение пространства префиксов-имен для любых атрибутов, которые находятся в этом пространстве имен?

Например, в этом примере

<parent xmlns="http://example.com/foo">
    <child attrib="value">text</child>
<parent>

Я бы интерпретировал приведенное выше определение, чтобы сказать, что пространство имен attrib пусто.

Так что, если бы мне нужно, чтобы attrib имел то же пространство имен, что и parent, то я был бы вынужден сделать это?

<foo:parent xmlns:foo="http://example.com/foo">
    <foo:child foo:attrib="value">text</foo:child>
<foo:parent>

или это?

<parent xmlns="http://example.com/foo" xmlns:foo="http://example.com/foo">
    <child foo:attrib="value">text</child>
<parent>

Это кажется мне глупым, поскольку кажется, что он побеждает назначение пространств имен по умолчанию. Я надеюсь, что просто неправильно понимаю спецификацию.

Ответы [ 4 ]

16 голосов
/ 23 июля 2010

Ты прав.Идея, лежащая в основе атрибутов, не являющихся частью пространства имен по умолчанию, заключается в том, что они считаются существующими в «пространстве имен элементов», поэтому в этом случае <foo:child/> считается «пространством имен» для @attrib.Обратите внимание, что это просто концептуально;нет никакого API или чего-либо, что ссылается на пространства имен атрибутов таким образом.

Это было выбрано потому, что несколько элементов могут иметь атрибуты с одинаковыми именами, но разными значениями - в отличие от традиционного пространства имен, которое представляет собой набор именбез дубликатов).В некотором смысле, это дает больше структуры пространству имен, вместо того, чтобы иметь плоский набор.

Вы можете прочитать об этом в очень старой версии рекомендации Пространства имен .

Это соглашение означает, что всякий раз, когда вы видите префиксный атрибут, он представляет некоторую «дополнительную» информацию, которая не связана с основной схемой в документе.

8 голосов
/ 25 декабря 2014

Согласно спецификации, вы правильно считаете, что пространство имен attrib в первом примере пустое.Однако здесь есть одна тонкость, которая может быть не очевидна.

Рассмотрим этот пример ниже в спецификации элемента с двумя атрибутами с одинаковым именем (один с префиксом, а другой без префикса).

<!-- This is OK, even though an element cannot have two attributes 
     with the same name -->
<x xmlns:n1="http://www.w3.org" 
   xmlns="http://www.w3.org" >
  <good a="1"     n1:a="2" />
</x>

Это соответствует, потому что два атрибута действительно находятся в двух разных пространствах имен:

  • n1:a принадлежит http://www.w3.org пространству имен (которое является пространством имен goodа также
  • a обрабатывается и относится к недоступному пространству имен http://wwww.w3.org > good (и отличается от пространства имен good).

Обратите внимание, что http://wwww.w3.org > good пространство имен не существует;например, вы не можете запрашивать атрибуты в этом пространстве имен с помощью XPath.Если вы попросите namespace-uri(\\good\a), оно будет пустым.Чтобы конкретизировать идею отдельного пространства имен элемента, я создал пространство имен, которое имеет пространство имен и имя элемента вместе с разделителем (> в любом случае не разрешается экранирование в значениях атрибута).

Теперь, вместо того чтобы сказать, что два атрибута находятся в двух разных пространствах имен, более правильно сказать, что они принадлежат двум разным разделам пространства имен :

  • * атрибут 1033 * принадлежит разделу глобальных атрибутов (http://www.w3.org)
  • * элемент 1037 * принадлежит разделу всех типов элементов (также http://www.w3.org)
  • a принадлежитРазделение на тип элемента good (т. Е. http://wwww.w3.org > good).

Вот соответствующая часть спецификации, с которой связан Porges:

A.2 Разделы пространства имен XML

Для поддержки цели создания обоихквалифицированные и неквалифицированные имена, полезные для достижения их предполагаемой цели, мы идентифицируем имена, появляющиеся в пространстве имен XML, как принадлежащие к одному из нескольких непересекающихся традиционных (то есть структурированных) пространств имен, называемых разделами пространства имен.Разделы:

Раздел Все типы элементов Все типы элементов в пространстве имен XML появляются в этом разделе.У каждого есть уникальная местная часть;комбинация имени пространства имен и локальной части однозначно идентифицирует тип элемента.

Раздел глобальных атрибутов Этот раздел содержит имена всех атрибутов, которые определены в этом пространстве имен какГлобальный.Единственной обязательной характеристикой глобального атрибута является то, что его имя должно быть уникальным в разделе глобального атрибута.Эта спецификация не делает никаких утверждений относительно правильного использования таких атрибутов.Комбинация имени пространства имен и имени атрибута однозначно идентифицирует глобальный атрибут.

Разделы по типам элементов Каждый тип в разделе Все типы элементов имеет ассоциированное пространство имен, в котором отображаютсяимена неквалифицированных атрибутов, которые предоставляются для этого элемента.Это традиционное пространство имен, потому что появление дублированных имен атрибутов в элементе запрещено XML 1.0.Комбинация имени атрибута с типом элемента и именем пространства имен однозначно идентифицирует каждый неквалифицированный атрибут.

В документах XML, соответствующих этой спецификации, имена всех квалифицированных (префиксных) атрибутов присваиваются разделу глобального атрибута,и имена всех неквалифицированных атрибутов назначаются соответствующему разделу для каждого типа элемента.

2 голосов
/ 23 июля 2010

Ваша интерпретация спецификации верна.Некоторое обоснование также дано во втором абзаце раздела 6.2 в спецификации пространств имен, на которую вы ссылались:

интерпретация нефиксированных атрибутов определяется элементом, на котором они появляются.

Но меня также интересовали бы некоторые подробности того, почему было выбрано именно это поведение.

0 голосов
/ 03 апреля 2019

Я нашел явное объяснение в «XML в двух словах» Эллиотта Расти Гарольда :

Атрибуты - это отдельная история. Пространства имен по умолчанию применяются только к элементы, а не атрибуты.

...